2014-12-28 50 views
1

我怎樣才能建立動態where子句,一段時間OwnerID將爲零僅itemIDLocationID將提供作爲搜索條件,在這種情況下,LINQ應該動態構建LINQ到實體Where子句

(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)。

回答

3

您可以使用基於方法的查詢輕鬆完成此操作。您可以一次添加的條件之一,並呼籲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(); 
+1

這是該方法在這種情況下最具可讀性和正確性 – Zac

0

簡單的方法是隻檢查零條件在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();