2012-09-22 12 views
15

せずにFindを使用してdbSetのレコードを検索します。現在の状況で 私は彼のIDを使用することはできません。私は、ユーザーテーブルを持っている主キー

私は完全なLINQクエリを使用する必要がありますか?例えば私も自分のEDMXの主キーとしてユーザー名を定義しようとしたが、それは次のようなエラーが生じた

var user = from users in myDBContext.Users.Find(Username) 
      where users.Username == username 
      select users 

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

答えて

35

お試しください。

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username); 

SingleOrDefault insted of Single。ユーザーが存在しない場合、Singleはエラーをスローします。 SingleOrDefaultnullを返しますが、見つからない場合はUserオブジェクトが返されます。あなたはSingleOrDefaultを使用してユーザーオブジェクトを取得し、FirstOrDefaultできSingleOrDefaultFirstOrDefault

の選択が、ポイントの下に考慮を使用する方法を選択した状態。

  • 両方ともコレクション/データベースの値が1つだけ存在する場合は、それ以外の場合はデフォルト値を返します。
  • ただし、複数のユーザーが同じ名前を持ち、LINQクエリの実行中に例外が発生することが予想される場合は、SingleOrDefaultを使用してください。利用可能な要素が複数ある場合は例外がスローされます。
  • 例外を除きたくない場合、またはコレクション/データベースにデータの重複があるかどうかチェックしたくない場合は、コレクション/データベースの最初の値を取得したい場合はFirstOrDefaultを使用して、より良いパフォーマンスをSingleOrDefault

FirstOrDefault

  • 一般FirstOrDefault又はFirst我々は、(最初​​の)コレクションまたはデータベースから単一の値を必要なときに使用されます。
  • Fist/FirstOrDefaultの場合、データベースから1行だけが取得されるため、single/SingleOrDefaultよりもわずかに優れたパフォーマンスを発揮します。このような小さな違いはほとんど目に見えませんが、表に列と行が多数含まれている場合、現時点ではパフォーマンスが顕著になります。

他のいくつかの発言

  • usernameが主キーであるならば、私はそこに主キーインデックスを持つようSingleOrDefaultFirstOrDefaultパフォーマンスの間にはあまり/まったく差がないとインデックス列を検索すると思います常に通常の列より速くなります。
  • SingleまたはSingleOrDefaultは、 "SELECT ..."のような通常のTSQLを生成します。
  • FirstまたはFirstOrDefault方法は
+0

さらに良い! ..ありがとう。 – Mortalus

+0

代わりに 'FirstOrDefault'を使用する方が良いでしょうか? 'SingleOrDefault'メソッドについての私の理解は、* whole *テーブルをブラウズして、条件に一致するレコードが1つだけであることを確認することです。 OPが望むものではないかもしれません。 – Crono

+1

@Cronoはい、FirstOrDefaultと比較するとFirstOrDefaultのパフォーマンスが良いと考えています。しかし、ここで私はこれらの2つの方法の間で選択を行うべき期待される結果に応じて考える。単一の結果しか必要とせず、複数のシーケンスが存在する場合は例外が発生することを期待している場合は、SinleOrDefaultを使用します。それ以外の場合はFirstOrDefaultを使用します。私はこの文脈で私の答えを更新します。 –

3

私はそれを見つけた:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username); 
+0

はい、それは大丈夫です「... TOP 1を選択」などのTSQLのなステートメントが生成されますが、それはあなたの問題の解決策であるので、あなたは答えとして、それを受け入れる必要があります。 –

+0

それは私が2日以内にそれを受け入れることができることを私に伝えますので、私は待っています.. tnx – Mortalus

+0

@Mortalusはあなたの質問に役立つなら、私の答えを見つけます。 Single to SingleOrDefaultを変更しました。 –

関連する問題