[英]Linq - Filter list property that is inside another list by a list of strings
[英]LINQ Filter List inside another LINQ Query
好的,所以我有一個看起來像這樣的模型:
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));
這將返回以下異常:
無法隱式轉換為'bool'無法將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
所以.Any()的問題是,如果它包含一個與1匹配的值,它將返回整個集合,我只想要它返回與1匹配的值。所以,因此,我唯一想到的就是要做的是增加多余的118行,然后過濾返回的列表。 幸運的是,在進行概要分析時,這並沒有像我最初預期的那樣影響SQL Server,因此沒有必要進行預優化。 但是,如果有人知道如何使用LINQ在初始SQL查詢中過濾列表,我還是很想知道,因為我確定以后可以在對數據庫的影響可能更嚴重的情況下使用它,因此可以進行優化保證。
“ .Where” lambda函數需要返回一個布爾值。 當前,您正在針對另一個記錄集返回“ .Where”的結果。 相反,您可能打算這樣做:
var results = db.TableA
.Where(t => t.idA == id)
.Where(t => t.Association.Any(m => m.idB == 1));
如果“ t.Association”包含符合條件的任何記錄,則“ .Any”函數將返回true。
我認為您要使用Any
方法。 這樣的事情應該起作用:
var results = db.TableA
.Where(t => t.idA == id)
.Where(t => t.Association.Any(m => m.idB == 1));
這將返回任何Table
與idA
等於id
,並至少在Association
與idB
等於1。
或者,如果您更喜歡查詢語法:
var results =
from a in TableA
where a.idA == id && a.Association.Any(m => m.idB == 1)
select a;
這應該工作:
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
字段,以及包含其idB
為1
關聯項目的AssociatedItem
。
請注意,以上代碼假定idB
為1
情況下最多存在一個關聯項目; 否則, SingleOrDefault
將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.