2011-03-03 11 views
3

コードのサンプルが必要です。現時点で は、私は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クエリの戻りレコードのみでLINQを使用しています。

VARの使用Typedオブジェクトを取得できず、そのプロパティ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

whan SQLスタイルを読んで理解する方が良いでしょうあなたがそれを使用しなかった場合、あなたは問題がないでしょう。 –

答えて

7

あなたのクエリは、単一のオブジェクト、あなたSelect方法を返す場合でも、背後で使用していますが、そうではありません。 EFにIQueryable<T>を返します。

あなたは、単一のオブジェクトを格納する場合は、そのようなSingleSingleOrDefaultFirstFirstOrDefaultなどの方法を使用する必要があります。

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

4つの方法の違いは:

  • Single:配列の唯一の要素を返し、シーケンス内の正確に1つの要素が存在しない場合に例外をスローします。
  • SingleOrDefault:シーケンスの唯一の要素を返します。シーケンスが空の場合はデフォルト値を返します。シーケンス内に複数の要素がある場合、このメソッドは例外をスローします。
  • First:シーケンスの最初の要素を返します。
  • FirstOrDefault:シーケンスの最初の要素を返します。シーケンスに要素が含まれていない場合は既定値を返します。

MSDNから定義)

+0

ありがとうすばらしい説明! – GibboK

+0

ようこそ。ここで最も重要なのは、Aasmundが答えたところで、 'var'は型ではなく、コンパイル時に、式の右辺の式から推論された型で置き換えられるということです。これは 'IQueryable '(オブジェクトにLinqを持つ 'IEnumerable ')です。 'Single'や他のメソッドを使うときには' T'を得ます。 – madd0

+0

コメントをいただきありがとうございます。このコンセプトを理解するのに役立ちます。 – GibboK

5

LINQ select -statementは常に照会可能コレクションを返します。したがって、そこから単一のオブジェクトを取得する必要があります。

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

返されるオブジェクトのタイプ(すなわちvarの効果だ。var自体は型ではない)(CmdSlotは、要素の型であると仮定)、及びquerySlotOrderはその種類を取得IQueryable<CmdSlot>あります。結果コレクションに常に正確に1つの要素が存在することが絶対確実であれば、querySlotOrder.Single()で取得できます。

-3

なぜvarを使用しますか?

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

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

あなたは彼の質問に答えていませんが、むしろ彼のスタイルに疑問を呈しています。たくさんのLinqサンプルを含む多くの人がvarを使用しています。何も間違っていません。それにかかわらず、あなたのコードはとにかく間違っています。 –

+0

これはコンパイルされません。各スロットアイテムがMyObjectTypeタイプであると仮定すると、結果クエリはMyObjectTypeではなくIQueriable タイプになります。 –

+0

私はラファと完全に同意します – GibboK

2

デニスは彼の答えで指摘されたとして、あなたは、あなたが戻ってからのIEnumerableを取得している、1つのオブジェクトのインスタンスを取得していない:あなたがオブジェクトの種類を知っていればあなたはquerySlotOrderを入力する必要があります期待しますあなたの質問。 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のコードですが、代わりにSQLスタイルのC#のスタイルを使用する

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

を再フォーマットであるとして、

関連する問題