gpt4 book ai didi

c# - 在联接中使用委托(delegate) CompiledQuery?

转载 作者:太空狗 更新时间:2023-10-29 23:47:52 35 4
gpt4 key购买 nike

我有一个与 this previous question of mine 相关的问题.在涉及多个连接的现有 LINQ 位中,我尝试采用包含连接的每个单独方法并将其转换为 CompiledQuery

首先是普通的LINQ方法:

private IQueryable<Widget> GetWidgetQuery()
{
return db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value));
}

在这里,CompiledQuery 的委托(delegate)(字段)定义如下:

private static readonly Func<DBDataContext, IQueryable<Widget>> GetWidgetQuery = 
CompiledQuery.Compile((DBDataContext db) =>
db.Widgets.Where(u => (!u.SomeField.HasValue || !u.SomeField.Value)));

如果我将鼠标悬停在方法 GetWidgetQuery() 的普通 LINQ 语句上,我会看到它是一个如下所示的方法:

(method) IQueryable<Widget> GetWidgetQuery()

但是,编译后的查询委托(delegate)(字段)有如下不同:

(field) Func<DBDataContext, IQueryable<Widget>> GetWidgetQuery

在将后者作为 LINQ 语句的一部分执行时,语法如下不同。一、普通LINQ参与join:

var myquery =
from wxr in GetWidgetXRQuery()
join w in GetWidgetQuery() on wxr.WidgetID equals w.ID
select new DTO.WidgetList
{
...
}

在这里,以委托(delegate)的形式调用 CompiledQuery:

var myquery =
from wxr in GetWidgetXRQuery()
join w in GetWidgetQuery.Invoke(myContext) on wxr.WidgetID equals w.ID
select new DTO.WidgetList
{
...
}

前者返回预期的结果集;后者,当我尝试 myquery.ToList() 时,会产生一个 stackoverflow 异常,部分与 this limitation of .NET 3.5 有关, 我认为。

有人能帮我理解作为字段(或者我想我应该说是委托(delegate))而不是方法存在的编译语句是如何杀死我的查询的吗?简而言之,我知道我做的是错的,但我不确定我是否理解我的误解。

最佳答案

我尝试做与您在 EF 4 上所做的大致相同的事情,一切似乎都运行良好。因此,这要么是 EF 3.5 问题,要么与您对 GetWidgetXRQuery 的实现有关,或者是两者的某种组合。

但我真正想说的是,作为Roy Goode stated在回答您之前的问题时,一旦以任何方式扩展该查询,您将失去预编译查询的所有优势。通过尝试对您的查询执行连接,您将其转换为一个普通的旧查询。因此,您不妨只使用似乎适合您的非编译版本。

更新

意识到您在谈论 LINQ to SQL。这种查询似乎在 Entity Framework 中有支持,但在 LINQ to SQL 中没有。在 .NET 4 中,我收到以下错误:

An IQueryable that returns a self-referencing Constant expression is not supported.

这对我来说意义不大,但我猜测它与内部表示已编译查询的方式有关。如果我将查询评估为一个变量并稍后在查询中使用该变量,我仍然会遇到同样的错误,因此它显然与委托(delegate)和函数之间的区别无关。我仍然坚持编译查询不适合在这里使用。您需要创建一个大型编译查询来表示您要执行的整个查询,或者如果您希望以这种方式将它们拼凑在一起,则需要使用常规查询。

关于c# - 在联接中使用委托(delegate) CompiledQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263431/

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