2012-08-13 34 views
2

見下面兩個功能相同的查詢,SQL和lambda版本:Linq。如何在Linq(sql語法)查詢中使用AsEnumerable? EF4.1

from a in Lines.AsEnumerable() 
where a.LineId == SomeGuid 
select a 

-

Lines.AsEnumerable() 
.Where(a => a.LineId == SomeGuid) 
.Select(a => a) 

兩個查詢將被轉換成SQL不具有WHERE語句,像

SELECT * FROM Line 

在lambda中,我可以方便地在Where子句之後放置AsEnumerable,並且生成的SQL將具有WHERE子句。因此,拉姆達查詢會是這樣:

Lines 
.Where(a => a.LineId == SomeGuid) 
.AsEnumerable() 
.Select(a => a) 

並導致SQL是SELECT * FROM行,其中LineId = @參數

問: 我如何做到這一點使用LINQ SQL語法?換句話說,我希望我的結果SQL語句具有WHERE子句。我想避免從表格中拉出所有記錄。我試圖在查詢中的不同位置放置AsEnumerable,但是我未能使其工作。

編輯:
在簡單的語句把AsEnumerable在年底會的工作,但如果你使用投影,那麼EF抱怨(notsupported時例外:複雜類型不能構建...) 所以,

(from a in Lines 
    where a.LineId == SomeGuid 
    select new Line 
    { 
     LineId = a.LineId 
    }).AsEnumerable() 

都不行

+0

你怎麼知道LINQ查詢沒有WHERE子句?在我使用LINQ的經驗中,你會得到完全相同的結果,除了它是IQueryable,而不是IEnumerable。使用擴展方法,只有在.Where()後放置.AsEnumerable()時,纔會獲得WHERE子句。 – LeffeBrune 2012-08-13 19:31:59

+0

我在LinqPad中運行查詢,它顯示了我生成的SQL – bobetko 2012-08-13 20:00:51

+0

而且是的,那是我的問題。當我使用Linq SQL語法時,我不知道如何在WHERE子句後放置AsEnumerable。拉迪斯拉夫回答了這個問題。在這種情況下,似乎lambda語法會提供更容易閱讀的代碼。出於某種原因(我猜是因爲它看起來類似於T-SQL語法),我傾向於使用Linq SQL語法。 – bobetko 2012-08-13 20:04:41

回答

4

你可以簡單的做到這一點:

var query (from a in context.Lines 
      where a.LineId == SomeGuid 
      select a).AsEnumerable(); 

但在大多數情況下,這是不需要的。它使您的查詢可枚舉但不會執行您的查詢。該查詢將僅在迭代時執行。

Btw。您的示例中的.Select(a => a)不需要,因爲它會自動發生。

編輯:

LINQ到實體禁止投射到映射類型,因此正如我前面提到它迴應你必須第一個項目匿名類型,通話AsEnumerable和項目的真實映射類型。

var query = (from a in Lines 
       where a.LineId == SomeGuid 
       select new { 
        LineId = a.LineId 
       }).AsEnumerable() 
       .Select(a => new Line { LineId = a.LineId }); 

在這種情況下,你甚至不需要匿名類型,因爲你可以直接選擇a.LineId

+0

如果我使用投影怎麼辦?例如,下面的查詢會引發一個錯誤: (從上下文中.Lines 其中a.LineId == SomeGuid 選擇新行{LineId = a.LineId})。AsEnumerable(); – bobetko 2012-08-13 19:21:51

+0

直到您的投影包含一些.NET代碼或嘗試投影到映射類型(您的示例),它與投影一樣。在這種情況下,您必須投影到匿名類型,調用'AsEnumerable'並再次投影到您的真實類型。 – 2012-08-13 19:23:31

+0

非常感謝。這說得通。 – bobetko 2012-08-13 19:35:05