2011-08-23 59 views
0

我正在努力將一些現有的Linq轉換爲SQL,編入編譯查詢,部分使用this有幫助的文章作爲指導。常規和編譯Linq到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))); 

我遇到了一些麻煩可視化標準之間的差異並編譯此查詢的化身。假設我的語法是正確的,編譯後的查詢是否會返回與標準查詢相同的數據,只是使用Compiled查詢提供的優勢?

回答

1

是的,它會返回相同的數據 - IQueryable <Widget>對象 - 但與第一個示例不同,如果進一步擴展查詢,將會失去已編譯查詢的優點。

當您調用GetWidgetQuery()時,您將需要傳遞DBDataContext對象。

DBDataContext db; 

返回的IQueryable <的Widget >:

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

有:

var widgets = GetWidgetQuery(db); 

使用LINQ到SQL,這通過對結果進行LINQ查詢失去編譯查詢的好處是LINQ-to-SQL中編譯和非編譯查詢之間的區別。編譯後的查詢即使正在回退IQueryable,也會立即執行。看看我關於這個的問題,可能是相關的LINQ to SQL *compiled* queries and when they execute