C# 动态构建LINQ到实体Where子句
如何动态构建where子句,有时C# 动态构建LINQ到实体Where子句,c#,linq,entity-framework,linq-to-sql,linq-to-entities,C#,Linq,Entity Framework,Linq To Sql,Linq To Entities,如何动态构建where子句,有时OwnerID将仅为零itemID,并且LocationID将作为搜索条件提供,在这种情况下,LINQ应该是 (from s in repository.ItemOwners.Include("OwnerDetails") where s.ItemId == searchCriteria.ItemID && s.OwnerDetails.LocationId == searchCriteria.LocationID select
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();
(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.ItemId == searchCriteria.ItemID &&
s.OwnerDetails.LocationId == searchCriteria.LocationID
select new { s.OwnerDetails.OwnerName, s.OwnerDetails.MobNumber }).ToList();
(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();
最简单的方法是检查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();
在这种情况下,这是最具可读性和正确性的方法