正则和编译Linq to SQL之间的等价性



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

下面是我最初陈述的一个例子:

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

下面是我创建一个编译查询的尝试:

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

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

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

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

DBDataContext db;

返回IQueryable<Widget&gt:>

var widgets = GetWidgetQuery(db);

如果使用LINQ to SQL,就会因为对结果执行LINQ查询而失去编译查询的好处:

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

在LINQ-to-SQL中编译查询和非编译查询是有区别的。编译后的查询立即执行,即使它们只是返回IQueryable。检查我的问题关于这个,可能是LINQ到SQL *编译*查询,当他们执行

最新更新