2012-09-16 52 views
0

我已經使用ASP.NET MVC 4中的代碼優先方法創建了我的應用程序。在導航屬性內搜索

我有三個實體。也就是說,「公司」,「服務」和「ServiceFeature」:

我有一個搜索形式,它由複選框所有ServiceFeatures的。用戶將選擇複選框,並獲取提供具有選定ServiceFeatures的服務的公司的結果。

我得到公司名單與下面我的服務,但我被困在如何將在where子句選定ServiceFeatures(動態LINQ用for循環?)

var searchResults = _companyService.GetCompanies(); 

回答

0

假設你有包含選擇的要素ID的集合,被稱爲requested,假設你要提供包含所有選擇的功能服務的公司,例如,你可以這樣做:

var q = from c in searchResults 
     let sf = c.SuppliedService.ServiceFeatures 
            .Select(f => f.ServiceFeatureID) 
            .Intersect(requested) 
     where sf.Count() == requested.Count() 
     select c; 
0

在類似的情況下,我更喜歡的方法這有點比具有Intersect的linq查詢更精細。 Intersect可能會產生可觀的深層嵌套查詢,因爲帶有Id值的列表將通過列表中的每個Id的SELECTUNION命令構建。當Id的數量很少時(這種情況在我的假設中爲true),這不是問題,但是數字越大,它可能會引發SQL異常。

所以這是我喜歡什麼:

var q = context.Companies.AsQueryable(); 

foreach(int i in featureIds) 
{ 
    int j = i; // prevent modified closure. 
    q = q.Where(c => c.SuppliedService.ServiceFeatures.Any(f => f.Id == j)); 
} 

var result = q.ToList(); 

它建立了一些WHERE EXISTS子句的查詢。這可以是非常有效的,因爲每個EXISTS將尋找(不掃描)ServiceFeature的主索引。除此之外,INTERSECT是隱含的DISTINCT

那麼,只是想指出這一點。如上所述,如果記錄數量少,則不會發現任何差異。所以,儘量選擇適合自己的套裝。