合并可能为空的LINQ查询结果

Cat*_*key 2 c# linq coalesce null-coalescing-operator

我使用Linq从4个级联下拉菜单中返回ID.

用户可能已从1个或所有菜单中选择了1个或多个值.从用户选择中,我然后查询DataTable的文本列以获取代表ID.

如果用户从第4(和最低级别)下拉菜单中进行选择,那么他们将从上述所有选项中进行选择.

如果用户从菜单1中选择"X",从菜单2中选择"Y",而在其他人中没有任何内容我希望看到results110行,其中"X"存在于[Col_1]中,然后将查询说明results2[Col_2]中存在"Y"的5行.

编辑 守则(基本形式)

var results1 = 
    from a in dt.AsEnumerable()
    where stringArray1.Contains([Col1])
    select a;


var results2 = 
    from a in results1
    where stringArray2.Contains([Col2])
    select a;

var results3 = 
    from a in results2
    where stringArray3.Contains([Col3])
    select a;

var results4 = 
    from a in results3
    where stringArray4.Contains([Col4])
    select a;

var results = results4 ?? results3 ?? results2 ?? results1;
Run Code Online (Sandbox Code Playgroud)

results4取决于来自results3,results3打开results2results2打开的结果results1.

它可能results4 - 2是空的,因此我想知道我是否可以将这些合并为最终变量,例如:

var results = results4 ?? results3 ?? results2 ?? results1;
Run Code Online (Sandbox Code Playgroud)

这是抛出错误:

Operator '??' cannot be applied to operands of type 'System.Collections.Generic.IEnumerable<AnonymousType#4>'
Run Code Online (Sandbox Code Playgroud)

有没有人有任何狡猾的想法如何解决这个问题?我尽量不写很长的啰嗦代码,处理每一个可能的结果.

提前谢谢大家(希望这个问题有道理!)

厘米

Ser*_*rvy 5

因此,基于您正在使用的查询,结果都不会是null.其中一些可能是空的,但它们不会null.这意味着??操作员不会做任何有用的事情.

你希望这个表现如何?你想说,"如果这个结果是空的,那就用另一个吗?" 为此使用我在下面写的方法.

public static IEnumerable<T> Coalesce<T>(IEnumerable<T> first, IEnumerable<T> second)
{
  if(first == null || !first.Any())
  {
    return second;
  }
  else
  {
    return first;
  }
}
Run Code Online (Sandbox Code Playgroud)

这可以用作:

Coalesce(results4, Coalesce(results3, Coalesce(results2, results1)));
Run Code Online (Sandbox Code Playgroud)

结果是,"返回result4,除非它是空的.如果它是空的返回results3.如果results3是空的返回results2,如果results2是空的返回results1."

如果你认为你已经足够使用它,你可以使它成为一种扩展方法.它会让它更漂亮,但也会使所有其他IEnumerable的智能感知混乱,所以它可能不值得.