LINQ条件过滤

时间:2013-12-04 03:23:03

标签: 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;

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

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

if (members == null){ /*LINQ1*/ }
else { /*LINQ2*/ }

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

3 个答案:

答案 0 :(得分: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();

OR

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

我更喜欢第一个。

答案 1 :(得分:4)

由于||短路,您应该可以这样做:

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

如果(members == null || members.Contains(tb.membercode))truemembers子表达式将为null,因此不会评估Contains

答案 2 :(得分:0)

  WHERE  vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE  @FromDate END
    AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END