0

検索ページに機能を追加しようとしています。基本的に、(別のテーブルとの結合に基づいて) 特定の条件が true の場合、CSS クラスを適用します。ここに私の(単純化された)モデルがあります:

MyTable
int Key
string Someinfo1
string Someinfo2
string CssClass

SomeTable
int Key
string CssClass

LINQ を使用して、2 つのテーブルを結合し、割り当てSearchResult.CssClass = SomeTable.CssClassます。実際には、この割り当てに使用されるロジックがいくつかあります。

var test = db.MyTable
    .GroupJoin(db.SomeTable,
                m => m.Key,
                s => s.Key,
                (m, s) => new {m, s})
    .SelectMany(x => x.h.DefaultIfEmpty(),
                (x, y) => new MyTable
                {
                    Key = x.m.Key,
                    Someinfo1 = x.m.Someinfo1,
                    Someinfo2 = x.m.Someinfo2,
                    CssClass = y.CssClass
                }

このコードは壊れ、エラーが発生します

The entity or complex type 'MyTable' cannot be constructed in a LINQ to Entities query.

キャストを単純に変更し(x, y) => new MyTableて匿名型を作成すると、(x, y) => new期待どおりに機能します。MyTableただし、現在存在するビューと互換性があるように、これを型付きにする必要があります。他の方法では正常に動作するのに、キャストしようとすると壊れるのはなぜですか? 事後のキャストも機能しません。前もって感謝します

編集:明確にするために、をMyTable除いてデータベーステーブルにマップしますCssClass。その要素を無視するようにEFを構成しました

modelBuilder.Entity<MyTable>().Ignore(m => m.CssClass);

の望ましい値MyTable.CssClassは から得られSomeTableます。

DefaultIfEmpty() は、すべてのエントリを に含めるために使用されますMyTable。に Key が存在する場合がありますが、存在しMyTableません。SomeTable

4

1 に答える 1

1

エラーが示すように、クエリ内からエンティティ の新しいインスタンスを作成することはできません。

MyTableのプロパティをのプロパティでオーバーライドしようとしているようですSomeTable。このソリューションの欠点の 1 つは、エンティティが保存されている場合に新しいCssClass値が保存さMyTableれることです (これは必要なことですが、使用法に基づいているようには見えません)。本当にこれを行う必要がある場合は、エンティティを (たとえば でToList()) ハイドレートしてから、関連するエンティティからの値で値を更新するためにループする必要があります。

おそらく最善の策は、ビューをエンティティ クラスに結合するのではなく、ビューが使用する実際のエンティティ クラスから独立した型を作成することです。2 つのクラス間でマッピングする作業が追加されますが、直面しているような問題を回避できます。CssClassあなたのデータ モデルですでに見られる 1 つの課題 -値を or に保存する必要があるかどうかをどのように判断しますMyTableSomeTable?

于 2013-03-18T17:51:03.347 に答える