gpt4 book ai didi

c# - 经常使用从方法返回的 LINQ

转载 作者:行者123 更新时间:2023-11-30 22:13:17 25 4
gpt4 key购买 nike

我有 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()感谢Passing func as parameter in Linq to Entities and 'Internal .NET Framework Data Provider error 1025' error

最佳答案

在您的第一个示例中,函数被调用并翻译成表达式甚至在它被发送到查询提供程序之前。在接下来的两个示例中,函数调用嵌入到发送给查询提供程序的表达式中,而查询提供程序不知道如何处理该函数调用,因此它只是抛出一个异常。当您将实际表达式嵌入到另一个表达式中时,不会有函数调用来混淆查询提供程序。

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

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

关于c# - 经常使用从方法返回的 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com