有没有更好的方法来编写这个linq查询?

Col*_*nty 0 c# linq

我有一个名单Asset的实体,每个Asset都有名单Field实体具有两个属性各看起来像这样

| Index | Value |
| 0 | "hello" |
| 1 | "blah" |
| 2 | null |

在循环中我得到变量

i = 2i = 3

我有一个LINQ查询,试图得到如下:Assets有一个FieldValue对应的i就是null,或者是没有Field用的Index i.

例如,如果i为2,则它将返回具有上表的资产,因为它具有Fieldwhere 2对应的值null.

而且,如果i是3,也应该回到上面,因为没有FieldIndex3.

此代码有效:

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)

这不是很好,我想知道有没有办法在一个声明中做到这一点?

And*_*lor 7

其他答案有效,但如果你简化问题,它会变得更加直截了当:

assets.Where(a => !a.Fields().Any(f => f.Index == i &&
                                       f.Value != null))
      .ToList()
Run Code Online (Sandbox Code Playgroud)

你希望所有的AssetS其中没有一个FieldIndexi和非空Value.您无需将其拆分为两个条件.


Tim*_*ter 5

您不需要两个查询,只需使用一个||:

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)