我有一个名单Asset的实体,每个Asset都有名单Field实体具有两个属性各看起来像这样
| Index | Value |
| 0 | "hello" |
| 1 | "blah" |
| 2 | null |
在循环中我得到变量
i = 2 和 i = 3
我有一个LINQ查询,试图得到如下:Assets有一个Field在Value对应的i就是null,或者是没有Field用的Index i.
例如,如果i为2,则它将返回具有上表的资产,因为它具有Fieldwhere 2对应的值null.
而且,如果i是3,也应该回到上面,因为没有Field带Index3.
此代码有效:
var assets = (from a in assets where
a.Fields.Any(x => x.Index == i && x.Value == null) select a)
.Union(from a in assets where
a.Fields.All(x => x.Index != i) select a)
.ToList();
Run Code Online (Sandbox Code Playgroud)
这不是很好,我想知道有没有办法在一个声明中做到这一点?
其他答案有效,但如果你简化问题,它会变得更加直截了当:
assets.Where(a => !a.Fields().Any(f => f.Index == i &&
f.Value != null))
.ToList()
Run Code Online (Sandbox Code Playgroud)
你希望所有的AssetS其中没有一个Field与Index的i和非空Value.您无需将其拆分为两个条件.
您不需要两个查询,只需使用一个||:
assets = assets
.Where(a => a.Fields.Any(f => f.Index == i && f.Value == null)
|| a.Fields.All(f => f.Index != i))
.ToList();
Run Code Online (Sandbox Code Playgroud)