LINQ条件过滤

Pan*_*ang 6 c# linq

String Sex = getSex(); // return M or F
String[] members = getMembers(); // return member codes in array or null
//if members array is null, no filtering for member codes
var query = from tb in MemberTable
            where tb.sex.Equals(Sex) && 
                  (members != null ? members.Contains(tb.membercode) : true)
            select tb;
Run Code Online (Sandbox Code Playgroud)

代码不会返回正确的结果.无论是什么,它都会返回所有成员members[].

实际上原来的LINQ很复杂,所以如果还有其他可能的解决方案,我不想写下面的内容:

if (members == null){ /*LINQ1*/ }
else { /*LINQ2*/ }
Run Code Online (Sandbox Code Playgroud)

这不是一个好的编码风格.有什么建议可以解决这个问题吗?

Ale*_*aga 13

var query = MemberTable.Where(x=>x.sex.Equals(Sex))

if (members != null)
     query = query.Where(x=>members.Contains(x.membercode))

//use your query
query.ToList();
Run Code Online (Sandbox Code Playgroud)

要么

var query = from tb in MemberTable
        where tb.sex.Equals(Sex) && 
              (members == null || members.Contains(tb.membercode))
        select tb;
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一个.

  • 我绝对更喜欢第一个.这是最好的解决方案,因为它只会评估`members!= null`一次,而不是每个项目. (2认同)