3

次の SQL Server 2005 データベース スキーマがあります。

CREATE TABLE Messages (
   MessageID int,
   Subject varchar(500),
   Text varchar(max) NULL,
   UserID NULL
)

列 "UserID" (null の場合もあります) は外部キーであり、テーブルにリンクしています

CREATE TABLE Users (
   UserID int,
   ...
)

現在、次のクエリで使用するメッセージ、ユーザーなどの名前を持ついくつかの POCO クラスがあります。

public IList<Message> GetMessages(...) {
  var q = (from m in dataContext.Messages.Include("User")
           where ...
           select m); // could call ToList(), but...

  return (from m in q
          select new Message {
            ID = m.MessageID,
            User = new User {
              ID = m.User.UserID,
              FirstName = m.User.FirstName,
              ...
            }
          }).ToList();
}

ここで、エンティティ フレームワークに、Include("Users") を使用して、メッセージに関連付けられているユーザーがあればそれを読み込むようアドバイスすることに注意してください。また、最初の LINQ ステートメントの後で ToList() を呼び出さないことにも注意してください。そうすることで、射影リスト内の指定された列 (この場合は MessageID、UserID、FirstName) のみがデータベースから返されます。

ここに問題があります。Entity Framework が UserID == NULL のメッセージを検出するとすぐに、DB 値が NULL であるため Int32 に変換できないという例外がスローされます。

最後の数行を次のように変更すると

return (from m in q
        select new Message {
           ID = m.MessageID,
           User = m.User == null ? null : new User {
              ID = m.User.UserID,
              ...
           }
        }).ToList()

次に、実行時の NotSupportedException がスローされ、定数の User 型を作成できず、int、string、guid などのプリミティブのみがサポートされることが通知されます。

最初のステートメントの直後に結果を具体化し、その後メモリ内プロジェクションを使用する以外に、それを処理する方法を知っている人はいますか? ありがとう。

4

3 に答える 3

2

「メッセージ」クラスの宣言を含めるのを忘れていましたが、そのクラスの UserID プロパティが null 許容型として宣言されていないと思われます。その場合は、「int」から「int?」に変更してください。(null 許容 int)。

于 2008-09-30T06:17:37.263 に答える
0

を行ったので、オブジェクト内のプロパティを.Include("Users")トラバースして、必要な情報を取得できるはずです。UserMessage

于 2008-09-26T16:05:48.910 に答える
0

あなたの関係は1対1ではないと思います。

于 2008-09-26T15:55:39.077 に答える