常规和编译的Linq到SQL之间的等价?

我正在努力将一些现有的Linq转换为SQL 编译查询,部分使用这篇有用的文章作为指南。

以下是我原始陈述之一的示例:

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

这是我尝试创建编译的查询:

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

我在查看此查询的标准和编译化身之间的差异时遇到了一些麻烦。 假设我的语法正确,编译后的查询是否会返回与标准查询相同的数据,只是使用编译查询提供的优势?

是的,它将返回相同的数据 – IQueryable 对象 – 但与第一个示例不同,如果进一步扩展查询,您将失去编译查询的好处。

调用GetWidgetQuery()时,需要传递DBDataContext对象。

 DBDataContext db; 

返回IQueryable

 var widgets = GetWidgetQuery(db); 

使用LINQ to SQL,通过对结果执行LINQ查询,这会失去编译查询的好处:

 var widgetsUncompiled = GetWidgetQuery(db).Where(u => u.SomeField.HasValue); 

LINQ-to-SQL中的编译和非编译查询之间存在差异。 编译后的查询会立即执行,即使它们只是在撤回IQueryable。 查看我的相关问题,可能与LINQ to SQL *编译*查询以及执行时有关