经常使用的 LINQ 从方法返回

本文关键字:方法 返回 LINQ 常使用 | 更新日期: 2023-09-27 18:34:11

我有 1 个 LINQ 用了这么多。我尝试创建返回此 LINQ 的方法,如下所示:

    public static System.Linq.Expressions.Expression<Func<MyEntity, bool>> GetFilteredEntity() {
        return x => true/*Some condition*/;
    }
    public static Func<MyEntity, bool> GetFilteredEntity() {
        return x => true/*Some condition*/;
    }

并像这样使用它

    db.MyEntities.Where(GetFilteredEntity());

成功了,但是!我需要像这样使用它

    db.ParentEntities.Where(entity => entity.MyEntities.Where(GetFilteredEntity()));

这段代码也编译了,但是每次使用它时,我都会收到错误:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.

甚至:

db.ParentEntities.Where(entity => entity.MyEntities.Where(GetFilteredEntity())).ToList();

也抛出这个异常。

db.ParentEntities.Where(entity => entity.MyEntities.Where(x => true/*Some condition*/))

仍然工作正常!那么为什么会发生这种情况,并且有办法解决这个问题?

最终工作代码

public static Expression<Func<MyEntity, bool>> GetFilteredEntity() { return x => true/*Some condition*/; }

var expression = GetFilteredEntity();

db.ParentEntities.Where(entity => entity.MyEntities.AsQueryable().Where(expression ));

.AsQueryable()感谢将 func 作为 Linq 中的参数传递给实体和"内部 .NET 框架数据提供程序错误 1025"错误

经常使用的 LINQ 从方法返回

在第一个示例中,函数在发送到查询提供程序之前被调用并转换为表达式。 在接下来的两个示例中,函数调用嵌入在发送到查询提供程序的表达式中,并且该查询提供程序不知道如何处理该函数调用,因此它只是引发异常。 将实际表达式嵌入到另一个表达式中时,没有函数调用会混淆查询提供程序。

至于解决方案,只需将函数调用拉出到变量中即可。 查询提供程序足够聪明,可以看到您使用了一个封闭的 over 变量,并将提取其值。 对于函数调用,它只是不确定它是否应该评估它或尝试将其转换为应该在数据库端完成的事情。 尝试同时执行其中的一些操作对于查询提供程序和使用它的人来说都是非常混乱且难以使用的。 为了简化问题,在发送查询之前永远不会执行带有表达式的函数调用。 至于闭合的 over 变量,没有其他方法可以处理它,因此没有任何其他行为可以将其混淆。

var expression = GetFilteredEntity();
db.ParentEntities.Where(entity => entity.MyEntities.Where(expression ));

看起来 LazyLoading 可能是罪魁祸首,您是否尝试过在参数上弹出 ToList((?

db.ParentEntities.Where(entity => entity.MyEntities.Where(GetFilteredEntity()).ToList());