11

基本的に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;
}

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

4

5 に答える 5

20

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;
}
于 2009-09-17T17:46:56.460 に答える
12

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

このシナリオでオブジェクトの初期化を利用するために、多くの人が適切なカプセル化の慣行を破っているのを見ることができます。

于 2010-12-06T05:43:53.487 に答える
6

.AsEnumerable()を使用しないのはなぜですか?そうすれば、パラメーターのないコンストラクターを作成する必要がなくなり、それが必要になります。

あなたのコードはほとんど良かった。これに変更します:

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

今日も同じ問題がありました。1つのパラメーターコンストラクターを持つクラスがありました。このコンストラクターは、プロパティによって返されるプライベート読み取り専用フィールドに、セットではなくgetのみを入力しました。

于 2011-06-21T08:40:42.163 に答える
3

別の初期化を試してください。

public class FooWrapper
{
    public FooWrapper() { }

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


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;
}
于 2009-09-17T17:49:32.690 に答える
2

これは、「LinqtoEntitesでサポートされているのはパラメーターのないコンストラクターのみ」の可能な回避策として役立つことがわかりました。

于 2010-12-20T17:04:26.893 に答える