【问题标题】:Dynamically Building LINQ-To-Entities Where Clause动态构建 LINQ-To-Entities Where 子句
【发布时间】:2014-12-28 19:38:49
【问题描述】:

如何动态构建 where 子句,有时 OwnerID 将为零,只有 itemIDLocationID 将作为搜索条件提供,在这种情况下,LINQ 应该是

(from s in repository.ItemOwners.Include("OwnerDetails")
 where s.ItemId == searchCriteria.ItemID && 
       s.OwnerDetails.LocationId == searchCriteria.LocationID
 select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();

有时OwnerIDItemId 将为零,那么将仅提供LocationID 作为搜索条件,在这种情况下,LINQ 应该是

(from s in repository.ItemOwners.Include("OwnerDetails")
 where s.OwnerDetails.LocationId == searchCriteria.LocationID
 select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();

有时会提供整个OwnerIDItemIDLocationID 作为搜索条件,那么LINQ 将是这样的

(from s in repository.ItemOwners.Include("OwnerDetails")
 where s.OwnerId == searchCriteria.OwnerID && 
       s.ItemId == searchCriteria.ItemID && 
       s.OwnerDetails.LocationId == searchCriteria.LocationID
 select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();

这里只有where子句在改变,请帮我解决。如何动态构建where 子句(请注意,这里我有一个导航属性OwnerDetails.LocationId)。

【问题讨论】:

    标签: c# linq entity-framework linq-to-sql linq-to-entities


    【解决方案1】:

    您可以使用基于方法的查询轻松完成。您可以一次添加一个条件,并在末尾调用SelectToList

    // Where(x => true) might not be necessary, you can try skipping it.
    var query = repository.ItemOwners.Include("OwnerDetails").Where(x => true);
    
    if (searchCriteria.OwnerID != null)
        query = query.Where(s => s.OwnerID == searchCriteria.OwnerID);
    if (searchCriteria.ItemID != null)
        query = query.Where(s => s.ItemID == searchCriteria.ItemID);
    if (searchCriteria.OwnerID != null)
        query = query.Where(s => s..OwnerDetails.LocationId == searchCriteria.LocationID);
    
    var results = query.Select(s => new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();
    

    【讨论】:

    • 这是在这种情况下最易读和最正确的方法
    【解决方案2】:

    最简单的就是检查 Where 子句中的零条件:

    (from s in repository.ItemOwners.Include("OwnerDetails")
    where (searchCriteria.OwnerID == 0 || s.OwnerId == searchCriteria.OwnerID) && 
    (searchCriteria.ItemID == 0 || s.ItemId == searchCriteria.ItemID) && 
    s.OwnerDetails.LocationId == searchCriteria.LocationID
    select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();
    

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 2013-01-15
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多