另一个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查询中过滤列表,我仍然很想知道,因为我相信我将来可以使用它,因为它对数据库的影响可能会更严重,因此优化是有必要的。
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
,其中idB
为1
。
注意,上述代码假设与1
的idB
最多存在一个关联项;否则SingleOrDefault
将失败。