次の 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 などのプリミティブのみがサポートされることが通知されます。
最初のステートメントの直後に結果を具体化し、その後メモリ内プロジェクションを使用する以外に、それを処理する方法を知っている人はいますか? ありがとう。