LINQ:添加条件,where子句条件LINQ:添加条件,where子句条件(Linq: addin

2019-05-17 06:58发布

我有这样一个查询

(from u in DataContext.Users
       where u.Division == strUserDiv 
       && u.Age > 18
       && u.Height > strHeightinFeet  
       select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();

我想补充的各种条件,如年龄,基于这些条件是否已提供给运行此查询的方法的高度。 所有的条件将包括用户司。 如果年龄提供我想要的是添加到查询。 与之相似,如果提供高度我想补充一点为好。

如果这是使用SQL查询来完成我将不得不使用字符串生成器,让它们附加在主STRSQL查询。 但在这里Linq中我只能想到使用IF条件,我会写三次相同的查询,与具有附加条件的每个IF块。 有一个更好的方法吗?

谢谢你的时间..

Answer 1:

如果你不调用ToList()并最终映射到DTO类型,您可以添加Where条款,当您去,并建立在最后的结果:

var query = from u in DataContext.Users
   where u.Division == strUserDiv 
   && u.Age > 18
   && u.Height > strHeightinFeet
   select u;

if (useAge)
   query = query.Where(u => u.Age > age);

if (useHeight)
   query = query.Where(u => u.Height > strHeightinFeet);

// Build the results at the end
var results = query.Select(u => new DTO_UserMaster
   {
     Prop1 = u.Name,
   }).ToList();

这仍然只会导致对数据库,这将是有效的,正如作为一个合格的书面查询效率的单一调用。



Answer 2:

一个选项。

bool? age = null

(from u in DataContext.Users
           where u.Division == strUserDiv 
           && (age == null || (age != null && u.Age > age.Value))
           && u.Height > strHeightinFeet  
           select new DTO_UserMaster
           {
             Prop1 = u.Name,
           }).ToList();

或者你可以切换到方法的语法LINQ和使用,如果条件表达式附加到where子句。



Answer 3:

我通常使用的方法链接,但有同样的问题。 这里是我的扩展使用

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

        return source;
    }

这有助于避免链断裂。 也同样ConditionalOrderByConditionalOrderByDescending是有益的。



Answer 4:

这里是我的代码做了类似的事情。 这是对我的WCF SOAP的Web服务API的方法。

    public FruitListResponse GetFruits(string color, bool? ripe)
    {
        try
        {
            FruitContext db = new FruitContext();
            var query = db.Fruits.Select(f => f);
            if (color != null)
            {
                query = query.Where(f => f.Color == color);
            }
            if (ripe != null)
            {
                query = query.Where(f => f.Ripe == ripe);
            }
            return new FruitListResponse
            {
                Result = query.Select(f => new Fruit { Id = f.FruitId, Name = f.Name }).ToList()
            };
        }
        catch (Exception e)
        {
            return new FruitListResponse { ErrorMessage = e.Message };
        }
    }

基本查询是Select(f => f)这意味着基本上一切,和Where子句任选地连接到它。 最终的Select是可选的。 我用的数据库行对象转换为结果“水果”的对象。



Answer 5:

只要我在我的地方作为第使用它

    public IList<ent_para> getList(ent_para para){
     db.table1.Where(w=>(para.abc!=""?w.para==para.abc:true==true) && (para.xyz!=""?w.xyz==para.xyz:true==true)).ToList();
}


Answer 6:

基于某些condtion添加where条件...

from u in DataContext.Users
where u.Division == strUserDiv 
&& u.Age != null ? u.Age > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
&& u.Height != null ? u.Height > 18 : 1== 1
 select new DTO_UserMaster
       {
         Prop1 = u.Name,
       }).ToList();


文章来源: Linq: adding conditions to the where clause conditionally