LINQ to Entitiesの強く型付けされたオブジェクトの初期化

entity-framework linq linq-to-entities strong-typing

質問

私は基本的に2つのエンティティフレームワークオブジェクトのラッパーである単純で古いCLRオブジェクトを持っています、私はMVCフレームワークの強く型付けされたビューにこのラッパーオブジェクトを渡すことができるようにしています。私のfooラッパークラスはとてもシンプルです。

public class FooWrapper
{
    public FooWrapper(Foo f, Bar b)
    {
        this.FooObject = f;
        this.BarObject = b;
    }

    public Foo FooObject { get; private set; }
    public Bar BarObject { get; private set; }
}

私のListFoosWithBars関数には、次のようなものがあります。

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);
    IEnumerable<FooWrapper> results = (from f in _entities.FooSet
                                       join b in tempBar on f.ID equals b.foos.ID
                                       select new FooWrapper(f, b));
    return results;
}

LINQ to Entitiesは明らかにパラメータ化された初期化をサポートしていないため、これは機能しません。「LINQ to Entitiesではパラメータなしのコンストラクタとイニシャライザのみがサポートされている」という例外がスローされます。私はこれと同じ結果を達成するための別の方法があるかどうか疑問に思いましたか?

受け入れられた回答

FooWrapperにパラメータなしのコンストラクタを追加してから、オブジェクト初期化を代わりに使用する場合は、次のようにします。

public IEnumerable<FooWrapper> ListFoosWithBars(int userID)
{
    IEnumerable<Bar> tempBar = ListBarsByUserID(userID);

    IEnumerable<FooWrapper> results = (
        from f in _entities.FooSet
        join b in tempBar on f.ID equals b.foos.ID
        select new FooWrapper()
        {
            FooObject = f, 
            BarObject = b
        });

    return results;
}

人気のある回答

それでは、FooObjectとBarObjectを読み取り専用にしたい場合はどうすればいいですか。オブジェクトに対してコンストラクターを使用する機能を無効にすることは、私には少し後退しているように思われます。

このシナリオでオブジェクトの初期化を利用するために、多くの人々が適切なカプセル化のプラクティスを破っていることがわかります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ