2

Funcを変数として保存してから、select内に変換をインラインで入力するのではなく、エンティティフレームワークselectに渡すことの違いは何ですか。

Func<Models.Contact,ViewModels.Contact> ToViewModel = 
    c => new ViewModels.Contact()
    {
        ID = c.ID,
        ...
        UserName = c.User.UserName
    };

...

return dc.Contacts.Select(ToViewModel);

とは対照的に

return dc.Contacts.Select(c => new ViewModels.Contact()
{
    ID = c.ID,
    ...
    UserName = c.User.UserName
});

どちらの方法も機能しますが、nullやその他のいくつかの方法に対して微妙に異なる反応を示し、その理由が理解できないため、これを尋ねます。

たとえば、この場合、連絡先にはユーザーがいる場合とない場合があるため、ユーザーはnullである場合とない場合があります。イニシャライザーをインラインで入力すると、プロパティが正常にnullに失敗します。ただし、変数を介して同じ初期化子を渡すと、NullReferenceExceptionがスローされます。

どうしてこれなの?

イニシャライザーを保存する理由は、WebApiからオブジェクトを返すための各CRUD操作で再利用できるようにするためです。特に時間の経過とともにプロパティを応答に追加または削除する必要がある場合は、クラスの周りに選択をコピーして貼り付ける必要があるのは面倒です。

4

1 に答える 1

4

2番目の例はExpression<Func<Contact, Contact>>、EFがサーバー上で実行されるにコンパイルされます。(IQueryableインターフェースを使用)
これは、NULL参照例外を生成しないOUTERJOINを使用するSQLクエリに変わります。

最初の例は式ツリーではないため、IEnumerable<T>インターフェイスを経由してクライアントで実行されます。に変更する
ことで、最初の例と同じように動作させることができます。ToViewModelExpression<Func<...>>

于 2012-10-22T15:41:39.290 に答える