gpt4 book ai didi

c# - 是否可以使用 linq(查询语法)中的范围变量作为参数?

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:34 24 4
gpt4 key购买 nike

我正在尝试使用 linq 查询中的范围变量作为参数;

简单的东西;

private static Expression<Func<context.Table1, bool>> funstuff(context.Table2 data)
{
return x => true;
}

像另一个简单的例子一样使用它,交叉连接;

var fun = from table2 in context.Table2
from table1 in context.Table1.Where(funstuff(table2))
select table1;

var f = fun.ToList();

我收到了这个错误;

variable 'table2' of type 'context.Table2' referenced from scope '', but it is not defined

是否可以在 Entity Framework 6 下使用范围变量作为参数?

编辑

context是 Entity Framework 的dbcontext

这段代码确实有效;

var fun = from table2 in context.Table2
from table1 in context.Table1.Where(x => table2.Id == 1)
select table1;

var f = fun.ToList();

这行不通;

private static Expression<Func<context.Table1, bool>> funstuff(context.Table2 data)
{
return x => data.Id == 1;
}



var fun = from table2 in context.Table2
from table1 in context.Table1.Where(funstuff(table2))
select table1;

var f = fun.ToList();

我期待它会起作用。

最佳答案

我假设您的 context 是一个 DbContext

尽管大多数功能相似,但是 QueryableEnumerable 还是有区别的。

IEnumerable 对象包含枚举本地内存中集合中对象的所有代码。 IEnumerable 对象可以在枚举它们时使用局部函数。

可查询枚举旨在在其他处理器上执行。 IQueryable 对象包含一个可以转换为其他处理器理解的格式的表达式。

这个翻译不在Expression中,而是在IQueryable的另一个属性中:ProviderProvider 知道要在哪种类型的机器上执行 Expression。根据请求,Provider 会将此表达式翻译(编译)为 native 可以理解的格式,并将翻译发送给 native 。

对象 context.Table2 实现了 IQueryableIQueryable 中的 Provider 知道如何将查询转换为 SQL。 SQL 不知道您的任何个人功能,如 funstuff,因此 Provider 不知道如何将其转换为 SQL。事实上,DbSet 甚至不支持所有类型的 LINQ 方法。

参见 MSDN: Supported and Unsupported LINQ Methods (LINQ to Entities)

因此,只要您的语句是 IQueryable,您就不能调用任何本地函数。

如果调用本地函数真的很重要,您可以将它们作为 IEnumerable 来执行。您可以使用函数 AsEnumerable 执行此操作.这会将 AsEnumerable 的输入数据带到本地内存。之后,您可以调用所有本地函数,就好像您的查询是一个 IEnumerable

但是存在性能风险:如果输入有数千个对象,而最终您只会得到几个对象,那么将所有这些信息都放入本地内存是一种浪费。

结论:在调用 AsEnumerable 之前,尝试将传输到本地内存的数据限制为最终结果所需的大小。之后,您可以调用任何您想要的本地函数。

关于c# - 是否可以使用 linq(查询语法)中的范围变量作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797757/

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