0

これは多面的な質問ですので、ご容赦ください!2 つのクエリがあります。

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => b.Table2);

var staticResult = Repository.Select<Table2>()
                       .Where(b => b.column == "CONSTANT");

return dynamicResult.Union(staticResult).ToList();

これはうまくいきます。ここで、追加のプロパティを Table2 クラスに追加し、次のように構成内のフィールドを無視するように EF に指示しました。

Ignore(e => NewColumn);

EFが例外をスローすることなくフィールドを適切に設定できるため、これもうまく機能しています。今、私がやりたいことを簡単に行う方法があるかどうかはわかりません。私の最初のクエリでは、Table1 に Table2 のこの新しい列を水和するために使用したい列がありますが、これを行う簡単な方法がわかりません。私が思いついた唯一のことは次のとおりです。

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn ... <additional initialization> });

これは少し面倒です。このエンティティにはハイドレートする必要がある約 15 の列があるため、初期化にはかなりの時間がかかります。もちろん、上記のクエリで Table2 と Table1 の関連付けを設定するのではなく、プロパティ内の Table2 と Table1 の間の関連付けをトラバースすることもできますが、それは追加の作業と維持するクエリがもう 1 つあるように思えます。さらに、上記の方法を使用すると、ユニオンが機能しなくなります。私のクエリが次のようになっている場合:

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn })

var staticResult = Repository.Select<Table2>()
                       .Where(b => b.column == "CONSTANT")
                       .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn })

return dynamicResult.Union(staticResult).ToList();

Entity または Complex 型 (表 2) は Entity Framework クエリで構築できないという例外が発生し、途方に暮れています。EF に NewColumn を無視するように指示する前に、このエラーが発生する理由を理解しましたが、このエラーがポップアップする理由がわかりません。

要約すると、新しい列をハイドレートするより良い方法はありますか?

ありがとう!

4

1 に答える 1

1

どのプロパティに対処するかに関係なく、EF クエリでエンティティ型を作成することは決して許可されません。その理由は、EF はそのようなエンティティを追跡する方法がないためです。

のような型を定義しTable2、新しい列を含めて、両方のクエリでその型に射影する必要があります。クエリを結合できます。

于 2013-02-05T21:31:16.617 に答える