簡體   English   中英

另一個LINQ查詢中的LINQ篩選器列表

[英]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));

這將返回任何TableidA等於id ,並至少在AssociationidB等於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字段,以及包含其idB1關聯項目的AssociatedItem

請注意,以上代碼假定idB1情況下最多存在一個關聯項目; 否則, SingleOrDefault將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM