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*/ }
这不是一个好的编码风格。 有什么建议可以解决这个问题吗?
答案 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))
为true
,members
子表达式将为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