另一个LINQ查询中的LINQ筛选器列表

本文关键字:LINQ 列表 筛选 查询 另一个 | 更新日期: 2023-09-27 18:24:55

好的,所以我有一个看起来像这样的模型:

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服务器,因此没有必要进行预优化。但是,如果有人知道如何使用LINQ在初始SQL查询中过滤列表,我仍然很想知道,因为我相信我将来可以使用它,因为它对数据库的影响可能会更严重,因此优化是有必要的。

另一个LINQ查询中的LINQ筛选器列表

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));

这将返回idA等于id的任何Table,并且至少返回idB等于1的Association

或者,如果您喜欢查询语法:

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字段和包含其关联项的AssociatedItem,其中idB1

注意,上述代码假设与1idB最多存在一个关联项;否则SingleOrDefault将失败。