2011-03-03 31 views
3

我想要一個代碼示例。 目前我使用LINQ在C#和asp.net 4 EF4Linq VAR和輸入對象

 var querySlotOrder = from slot in context.CmsSlots 
          where slot.SlotId == myCurrentSlotId 
          select slot; 

      if (querySlotOrder.SlotOrder == myNewSlotOrder) 
       e.Cancel = true; 

這LINQ查詢只返回一個記錄。

使用VAR我無法獲得類型化對象,我無法訪問其屬性SlotOrder。

如何更改查詢?感謝您的幫助

的話題用地資源:

http://msdn.microsoft.com/en-us/library/bb384065.aspx

http://msdn.microsoft.com/en-us/library/bb397947.aspx

http://msdn.microsoft.com/en-us/library/bb397678.aspx

+0

正如正常與var - 如果你沒有使用它,你不會有問題。 – 2011-03-03 15:10:33

回答

7

即使你的查詢返回一個對象,該Select方法,你在幕後使用,沒有。它在EF中返回一個IQueryable<T>

如果要存儲單個對象,則應使用諸如Single,SingleOrDefault,FirstFirstOrDefault的方法。

var querySlotOrder = (from slot in context.CmsSlots 
         where slot.SlotId == myCurrentSlotId 
         select slot).Single(); 

四種方法之間的區別在於:

  • Single:返回序列的唯一元素,如果存在的序列中的恰好一個要素是不拋出異常。
  • SingleOrDefault:返回序列的唯一元素,或者如果序列爲空,則返回默認值;如果序列中有多個元素,則此方法會引發異常。
  • First:返回序列的第一個元素。
  • FirstOrDefault:返回序列的第一個元素,或者如果序列不包含元素,則返回默認值。

(從MSDN定義)

+0

非常感謝! – GibboK 2011-03-03 14:20:56

+0

不客氣。這裏最重要的是要記住,正如Aasmund在他的回答中所說的那樣:'var'不是一種類型,而是在編譯時由右邊的表達式推導出來的類型替換 - 當使用「Select」方法從EF這將是'IQueryable '('IEnumerable '與Linq對象);當使用Single或其他方法時,你會得到'T'。 – madd0 2011-03-03 14:29:22

+0

再次感謝您的評論。它幫助我掌握這個概念,再見 – GibboK 2011-03-04 06:29:02

5

的LINQ select語句來始終返回一個可查詢的集合。因此您需要從中獲取單個對象。

var querySlotOrder = (from slot in context.CmsSlots 
         where slot.SlotId == myCurrentSlotId 
         select slot).FirstOrDefault(); 
5

類型返回的對象的是IQueryable<CmdSlot>(假設CmdSlot是元素的類型),以及querySlotOrder獲取類型(這是的var的效果; var本身不是一個類型)。如果您確信結果集合中始終只有一個元素,您可以使用querySlotOrder.Single()來檢索它。

-3

爲什麼使用var?如果你知道你所期望的對象的類型,你須querySlotOrder

MyObjectType querySlotOrder = (from slot in context.CmsSlots 
          where slot.SlotId == myCurrentSlotId 
          select slot).FirstOrDefault(); 

      if (querySlotOrder.SlotOrder == myNewSlotOrder) 
       e.Cancel = true; 
+3

你沒有回答他的問題,而是質疑他的風格。許多人使用var,包括許多Linq樣本。它沒有錯。無論如何,你的代碼是不正確的。 – 2011-03-03 14:14:14

+0

這不會編譯。假設每個槽項都是MyObjectType類型,結果查詢將是IQueriable類型的,而不是MyObjectType類型。 – 2011-03-03 14:19:21

+0

我完全同意Rafa – GibboK 2011-03-03 14:28:32

2

丹尼斯在他的回答指出,你沒有得到一個對象的實例,您取得一個IEnumerable回您的查詢。爲了訪問SlotOrder屬性,您需要從集合中選擇一個特定的項目,很可能是第一個 - 通過查詢來判斷。

3

linq查詢不會返回記錄,而會返回集合中只有1個元素的記錄。如果你想獲得的第一個元素,並且有,如果你確信只有1個集合中的元素,使用單一的擴展方法:

var querySlotOrders = from slot in context.CmsSlots 
         where slot.SlotId == myCurrentSlotId 
         select slot; 
var querySlotOrder = querySlotOrders.Single(); 

if (querySlotOrder.SlotOrder == myNewSlotOrder) 
    e.Cancel = true; 
0

這是madd0的代碼,但重新格式化使用C#風格替代了SQL風格

var querySlotOrder = context.CmsSlots 
    .Where(slot => slot.SlotId == myCurrentSlotId) 
    .Single(); 

這是更好地閱讀和理解煥SQL風格