2014-01-14 115 views
1

我有一個數據庫,我想要返回一個客戶端列表。多個包含和where子句Linq

這些客戶端有一個FamilyName列表。

我開始用這個

var query = DbContext.Clients.Include(c => c.FamilyNames).ToList() //returns all clients, including their FamilyNames...Great. 

但我希望有人能夠搜索FamilyName,ifany結果返回,然後顯示客戶端用戶。

所以我做了這個......

var query = DbContext.Clients.Include(c => c.FamilyNames.Where(fn => fn.familyName == textEnteredByUser)).ToList(); 

我想...

var query = DbContext.Clients.Include(c => c.FamilyNames.Any(fn => fn.familyName == textEnteredByUser)).ToList(); 

和...

var query = DbContext.FamilyNames.Include(c => c.Clients).where(fn => fn.familyname == textEnteredByUser.Select(c => c.Clients)).ToList(); 

我想知道些什麼(很明顯! )是我如何才能使這個工作,但我希望它儘可能在一個數據庫查詢中完成。即使有人能指出我正確的方向。

親切的問候

+0

查詢得到執行?或者在運行時有一些錯誤或異常? 我有嵌套的IQueryable查詢的問題,並且解決方案是在運行期間強制轉換.AsEnumerable並將一些數據存入Memody。 請寫一些細節,也許我會提醒...... – michalczukm

回答

2

在LINQ to您可以在性能導航實體,他們將被轉化爲加入語句。

這將返回一個客戶端列表。

var query = DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser)).ToList(); 

如果要包括與預先加載所有的姓氏,這應該工作:

var query = DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser)).Include(c => c.FamilyNames).ToList(); 

以下是有關loading related entities一些參考,如果按照預期的東西不起作用。

+0

對不起,我有點太快回答。它有效,但我想包括的是客戶,包括他們的FamilyNames。謝謝 – James

+1

我認爲這應該按照http://msdn.microsoft.com/en-us/data/jj574232.aspx:DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn = = textEnteredByUser))。Include(c => c.FamilyNames).ToList(); – Cosmin

1

你可以使用'投影',基本上你可以從任何級別選擇你想要的字段到一個新的對象中,可能是匿名的。

var query = DbContext.Clients 
    .Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser)) 
    // only calls that can be converted to SQL safely here 
    .Select(c => new { 
     ClientName = c.Name, 
     FamilyNames = c.FamilyNames 
    }) 
    // force the query to be materialized so we can safely do other transforms 
    .ToList() 
    // convert the anon class to what we need 
    .Select(anon => new ClientViewModel() { 
     ClientName = anon.ClientName, 
     // convert IEnumerable<string> to List<string> 
     FamilyNames = anon.FamilyNames.ToList() 
    }); 

這造成只有這兩個屬性的匿名類,然後強制查詢運行,然後進行第二投影到一個ViewModel類。

通常,我會選擇傳遞給UI的ViewModel,將其限制爲UI所需的最少數量的字段。您的需求可能有所不同

+1

我認爲這會失敗。 ToList()不能轉換爲linq到實體的查詢。 – Cosmin

+1

@Cosmin是的,對不起,我是在我頭頂上做的,在我的代碼中,我經常需要投影兩次,一次使用數據庫安全調用,第二次使用任何不是DB-安全(如格式化,調用其他方法進行轉換等)。我會更新我的答案。 –