2013-07-26 215 views
1

好了,我有一個模型,看起來像這樣:LINQ篩選器列表

public int idA 
public int idB 
public int total 

public virtual TableA TableA { get; set; } 
public virtual TableB TableB { get; set; } 

爲表A和B的模型是彼此相似,它們都配合這個喜歡的東西

public virtual List<Association> Assocation { get; set; } 

我現在想查詢這一點,這是工作,但我希望能夠過濾結果時idB前於某整數,例如:

var results = db.TableA 
       .Where(t => t.idA == id) 
       .Where(t => t.Association.Where(m => m.idB == 1)); 

這將返回以下情況除外:

無法隱式轉換爲「布爾」 無法轉換lambda表達式的委託類型「System.Func」,因爲一些塊的返回類型不隱式轉換爲委託返回類型

非常感謝您的幫助!

更新

所以我已經實現了以下內容:

var results = db.TableA 
       .Where(t => t.idA == id) 
       .Where(t => t.Association.Any(m => m.idB == 1)); 

由於該關聯表採用的是複合主鍵應該只有1個返回結果。有大約200個結果匹配給定的t.idA == id,這就是我回來的。它不僅返回了1個結果。

只爲正在創建徹底這裏的查詢,我省略了場自己去把它簡化一些:

SELECT ... fields here ... 
WHERE ([Extent1].[id] = @p__linq__0) AND (@p__linq__0 IS NOT NULL) 
AND (EXISTS (SELECT ... fields here .... 
       WHERE ([Extent1].[id] = [Extent2].[idA]) AND (1 = [Extent2].[idB]) 
      ) 
    ) 

更新2

所以用。任何()的問題是,它會返回整個集合,如果它包含一個匹配1的值,我只想返回匹配值爲1的值。所以,因爲這個原因,我唯一能想到的就是取多餘的118行,然後過濾返回的列表。幸運的是,在分析時,這並沒有像我最初預計的那樣影響SQL服務器,所以沒有必要進行預優化。但是,如果有人確實知道如何在使用LINQ的初始SQL查詢中過濾列表,我仍然很想知道,因爲我相信我可以在將來對數據庫的影響可能更嚴重時使用它,因此優化必要的。

+2

你的問題是什麼?錯誤信息非常清楚:'t => t.Association.Where(m => m.idB == 1)'必須返回一個布爾值,但是't.Association.Where(m => m.idB == 1 )'不是一個布爾。 – dtb

回答

0

這應該工作:

var results = db.TableA 
    .Where(t => t.idA == id) 
    .Select(t => new { 
     Item = t 
    , AssociatedItem = t.Association.SingleOrDefault(m => m.idB == 1) 
    }) 
    .Where(p => p.Associated != null) 
    .ToList(); 

此代碼會生成一個匿名類型的對象列表,其中包含兩個字段 - Item字段與該項目,以及AssociatedItem包含其關聯項目idB1

請注意,上面的代碼假定至多有一個關聯的項目idB1;否則,SingleOrDefault將失敗。

+0

謝謝,這正是我所尋找的 - 非常像LINQ to SQL連接。爲我節省了很多頭痛! – gregwhitworth

3

'.Where'lambda函數需要返回一個布爾值。目前,您將針對另一個記錄集返回「.Where」的結果。相反,你可能是打算是這樣的:

var results = db.TableA 
       .Where(t => t.idA == id) 
       .Where(t => t.Association.Any(m => m.idB == 1)); 

如果‘t.Association’包含符合條件的任何記錄的「任何」函數將返回true。

+0

是的,我明白這一點,但我想要的是它只返回匹配的1值,而不是簡單地告訴我該列表包含我正在尋找的值。謝謝您的意見。 – gregwhitworth

3

我認爲你想要做的就是使用Any方法。像這樣的東西應該工作:

var results = db.TableA 
       .Where(t => t.idA == id) 
       .Where(t => t.Association.Any(m => m.idB == 1)); 

這將返回任何TableidA等於id並至少在AssociationidB等於1

或者如果你喜歡查詢語法:

var results = 
    from a in TableA 
    where a.idA == id && a.Association.Any(m => m.idB == 1) 
    select a; 
+0

由於某些原因,它仍然返回118個結果(所有這些結果)都包括等於1和其他結果的結果。有什麼想法嗎? – gregwhitworth

+0

@coldcoder請更新您的問題,以包括您的預期和實際結果。 –

+0

謝謝,我做了 - 希望它能夠清除一些。 – gregwhitworth