2

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

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

4

3 回答 3

4

'.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。

于 2013-07-26T01:31:13.453 回答
3

我认为您想要做的是使用该Any方法。像这样的东西应该工作:

var results = db.TableA
                .Where(t => t.idA == id)
                .Where(t => t.Association.Any(m => m.idB == 1));

这将返回任何等于Table且至少等于 1 的值。idAidAssociationidB

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

var results = 
    from a in TableA
    where a.idA == id && a.Association.Any(m => m.idB == 1)
    select a;
于 2013-07-26T01:31:33.033 回答
0

这应该有效:

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.

请注意,上面的代码假设最多有一个与idBof关联的项目1;否则,SingleOrDefault将失败。

于 2013-08-04T21:59:11.410 回答