好的,所以我有一个看起来像这样的模型:
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 查询中过滤列表,我仍然很想知道,因为我确信我可以在将来对数据库的影响可能更严重的情况下使用它,因此优化保证。