31

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

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でユーザー名を主キーとして定義しようとしましたが、次のエラーが発生しました。

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

4

2 に答える 2

60

で試してみてください

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

SingleOrDefaultのinstedを使用しSingleます。ユーザーが存在しない場合はSingle、エラーがスローされます。ユーザーが見つからない場合はwhileSingleOrDefaultが返され、それ以外の場合はオブジェクトが返されます。nullUser

SingleOrDefaultとの間の選択FirstOrDefault

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

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

FirstOrDefault

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

他のいくつかの意見

  • が主キーの場合、主キーにはインデックスがあり、インデックス列の検索は常に通常の列よりも高速であるため、パフォーマンスとusernameの間に(重要な)違いはないと思います。SingleOrDefaultFirstOrDefault
  • SingleまたはSingleOrDefault、「SELECT...」のような通常のTSQLを生成します。
  • Firstorメソッドは、FirstOrDefault「SELECTTOP1...」のようなTSQLステートメントを生成します。
于 2012-09-23T05:06:21.510 に答える
5

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

User myUser = myDBContext.Users.Single(user => user.Username == i_Username);
于 2012-09-22T16:37:39.360 に答える