使用查询语法在Linq中有条件地

时间:2018-08-21 16:37:50

标签: c# linq

在LINQ中是否有一种更好的方式来使条件where子句等效于以下内容?

var doGroup=false;
var doSub=true;
var query= from mydata in Data_Details
            where 
                ((doGroup && mydata.Group == "xxxx") || (doGroup==false)) &&
                ((doSub && mydata.SubGroup == "yyyy") || (doSub==false))
            select mydata;

在上面的代码中,根据doGroup和doSub是否为true,它可以选择包含“ Group”和“ SubGroup”。

我知道使用方法语法时,您可以简单地保持将代码追加到查询中的不同行中,但是我更喜欢继续使用查询语法。

3 个答案:

答案 0 :(得分:3)

最简单的方法是优化条件本身

var doGroup=false;
var doSub=true;
var query=from mydata in Data_Details
                where 
                    (!doGroup || mydata.Group == "xxxx") &&
                    (!doSub || mydata.SubGroup == "yyyy")
                select mydata;

答案 1 :(得分:0)

您可以编写扩展方法:

public static IQueryable<T> WhereIf<T>(
   this IQueryable<T> source, bool condition, 
   Expression<Func<T, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

用法:

var doGroup =false;
var doSub = true;

var query = Data_Details
   .WhereIf(doGroup, q => q.Group == "xxxx")
   .WhereIf(doSub, e => e.SubGroup == "yyyy")

答案 2 :(得分:0)

Ruud Kobes的答案是正确的, 一小点,不需要投影数据, 不需要最后选择。

var doGroup=false;
var doSub=true;
var query=from mydata in Data_Details
            where 
                (!doGroup || mydata.Group == "xxxx") &&
                (!doSub || mydata.SubGroup == "yyyy");