2009-04-27 95 views
15

我有一種方法'沒有翻譯到SQL',我想在IQueryable上執行,有沒有辦法強制IQueryable執行而不必將其存儲在某些中間類中?強制執行IQueryable?

+0

這是一個盲猜,但是如果string.IsNullOrEmpty是罪魁禍首,那麼使用2 where子句代替:.Where(o => o.Name!= null).Where(o => o.Name.Length> 0) 。 – mayu 2012-03-01 08:58:06

回答

25

問題是您希望您的方法在本地執行而不是在數據庫中執行?如果是這樣,AsEnumerable是你的朋友。這是一個非常簡單的方法,是這樣的:

public IEnumerable<T> AsEnumerable(IEnumerable<T> source) 
{ 
    return source; 
} 

重要的是,它使結果IEnumerable<T>的編譯時類型,而不是IQueryable<T>,這意味着任何LINQ查詢操作調用後,這將是LINQ到對象而不是LINQ to SQL。

例如:

var query = context.Employees 
        // Filtering performed in SQL 
        .Where(emp => emp.IsFullTime) 
        .AsEnumerable() 
        // Projection performed locally; ComputeSalary has no 
        // SQL equivalent 
        .Select(emp => new { Employee = emp, 
             Salary = ComputeSalary(emp) }); 

你可以稱之爲ToList其他地方的建議,但如果你正在做的過濾和並不真正需要的名單在內存中,調用AsEnumerable和過濾結果將比首先加載所有內容更高效。

6
List<Employees> myEmployees = myqueryable.ToList(); 

然後你可以在你的列表上做你的LINQ的東西。

2

當你寫了一個查詢,LinqToSql不知道如何轉換成SQL(這也是它所說的)時,你會得到這個消息。

我不知道我明白你問什麼,但就我看,你有以下幾種選擇:

  1. 重寫查詢以便LinqToSql可以翻譯它
  2. 做的大部分的查詢,你可以在SQL Server上,然後做在內存中的剩餘部分(使用LINQ to對象)
  3. 坐下哭泣

假設我們排除#3,讓我們來看看其他2例子。

  1. 重寫它 - 爲了解決這個問題,我們需要你的linq查詢。

  2. 在這裏,您可以從初始查詢中取出無法翻譯的部分,然後在Iqueryable上調用ToList,然後將該查詢的其餘部分應用於該列表。

你可以執行查詢而不必存儲它嗎?那麼,不是真的,你總是可以遍歷結果,因此不會將其存儲在變量中,但顯然查詢的結果需要存儲在某個地方。

+1

一個人不需要坐下來哭泣。 – mayu 2012-03-01 07:56:54

+2

非常真實 - 但我覺得沒有人應該站立時哭泣。如果你不得不哭,你需要正確地做。 – kastermester 2012-03-02 00:00:30