Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态构建LINQ到实体Where子句_C#_Linq_Entity Framework_Linq To Sql_Linq To Entities - Fatal编程技术网

C# 动态构建LINQ到实体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

如何动态构建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();
(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();

在这种情况下,这是最具可读性和正确性的方法