我如何动态构建 where 子句,有时 OwnerID
将为零,只有 itemID
和 LocationID
将作为搜索提供标准,在这种情况下,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();
有时 OwnerID
和 ItemId
将为零,然后仅提供 LocationID
作为搜索条件,在这种情况下,LINQ应该是
(from s in repository.ItemOwners.Include("OwnerDetails")
where s.OwnerDetails.LocationId == searchCriteria.LocationID
select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();
有时会提供整个 OwnerID
、ItemID
和 LocationID
作为搜索条件,那么 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
)。
最佳答案
您可以使用基于方法的查询轻松地做到这一点。您可以一次添加一个条件,并在最后调用 Select
和 ToList
:
// 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();
关于c# - 动态构建 LINQ-To-Entities Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674335/