web-dev-qa-db-ja.com

主キーなしで検索を使用してdbSetでレコードを検索します

ユーザーテーブルがあります。

_Users:
 +ID
 +Username
 +...
_

myDBContext.Users.Find(Username)を使用してユーザーをフィンしたい。私の現在の状況では、彼のIDは使用できません。

完全なLINQクエリを使用する必要がありますか?例えば.

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

また、edmxでユーザー名をプライマリキーとして定義しようとしましたが、次のエラーが発生しました。

プリンシパルロールユーザーが参照するプロパティは、Relationship CamelotShiftManagementModel.AssociationUserFK1のリレーションシップ制約でプリンシパルロールが参照するEntityType CamelotShiftManagementModel.Userのキーと正確に一致する必要があります。すべてのキープロパティがプリンシパルロールで指定されていることを確認します。 C:\ Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

26
Mortalus

で試して、

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

SingleOrDefaultの代わりにSingleを使用します。ユーザーが存在しない場合、Singleはエラーをスローします。ユーザーが見つからない場合はSingleOrDefaultnullを返しますが、そうでない場合はUserオブジェクトが返されます。

SingleOrDefaultFirstOrDefaultの間の選択

SingleOrDefaultFirstOrDefaultを使用してユーザーオブジェクトを取得できますが、使用する方法を選択する際には、以下の点を考慮してください。

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

FirstOrDefault

  • 通常、FirstOrDefaultまたはFirstは、コレクションまたはデータベースから単一の値(最初)が必要なときに使用されます。
  • Fist/FirstOrDefaultの場合、データベースから1行のみが取得されるため、single/SingleOrDefaultよりもわずかにパフォーマンスが向上します。このような小さな違いはほとんど目立ちませんが、テーブルに多数の列と行が含まれている場合、現時点ではパフォーマンスが顕著です。

その他の発言

  • usernameが主キーである場合、主キーにインデックスがあり、インデックス列での検索が常に高速になるため、SingleOrDefaultFirstOrDefaultのパフォーマンスに大きな違いはないと思います。通常の列より。
  • SingleまたはSingleOrDefaultは、「SELECT ...」のような通常のTSQLを生成します。
  • FirstまたはFirstOrDefaultメソッドは、「SELECT TOP 1 ...」のようなTSQLステートメントを生成します
51
Jignesh Thakker

私はそれを見つけました:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username);
4
Mortalus