初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます

entity-framework linq
初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます

私はこの例外を取得しています:

_
指定されたタイプメンバー ‘有料’は、LINQ to Entitiesではサポートされていません。 初期化子、エンティティメンバ、およびエンティティナビゲーションプロパティのみがサポートされています。
_

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .Where(o => o.Paid == false)
            .OrderByDescending(o => o.DateCreated);

        return View(debts);
    }

私のモデルクラス

public partial class Order
{
    public bool Paid {
        get {
            return TotalPaid >= Total;
        }
    }

    public decimal TotalPaid {
        get {
            return Payments.Sum(p => p.Amount);
        }
    }

支払いはフィールドの金額を含む関連テーブルです。支払いに関する正しい情報を示すWhere句を削除すると、クエリは機能します。コードの何が問題なのでしょうか?

で提案された答えのように解かれました:

    public ActionResult Index()
    {
        var debts = storeDB.Orders
            .OrderByDescending(o => o.DateCreated)
            .ToList()
            .Where(o => o.Paid == false);

        return View(debts);
    }

  94  20


ベストアンサー

エンティティは、PaidプロパティをSQLに変換しようとしていますが、テーブルスキーマの一部ではないためできません。

あなたができることは、エンティティに有料フィルタなしでテーブルを照会させ、その後、有料のものを除外することです。

public ActionResult Index()
{
    var debts = storeDB.Orders
        //.Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);

    debts = debts.Where(o => o.Paid == false);

    return View(debts);
}

それはもちろん、すべてのデータをWebサーバーに戻し、そのデータをフィルタリングすることを意味します。 DBサーバーでフィルタリングする場合は、テーブルに計算列を作成するか、ストアドプロシージャを使用できます。

106


同様の問題を解決する必要がありました。 上記のソリューションではメモリ内処理が必要であり、これは悪い習慣です(遅延読み込み)。

私の解決策は、述語を返すヘルパーを書くことでした:

public static class Extensions
{
    public static Expression> IsPaid()
    {
        return order => order.Payments.Sum(p => p.Amount) >= order.Total;
    }
}

linqステートメントを次のように書き換えることができます。

var debts = storeDB.Orders
                    .Where(Extensions.IsPaid())
                    .OrderByDescending(o => o.DateCreated);

これは、計算ロジック(DRY)を再利用する場合に便利です。 欠点は、ロジックがドメインモデルにないことです。

23


_
LinqはステートメントをSQLステートメントに変換し、データベースに実行します。
_

現在、この変換は、エンティティメンバー、初期化子、およびエンティティナビゲーションプロパティに対してのみ発生します。 そのため、関数を実行するか、プロパティの比較を取得するには、まずそれらをメモリ内のリストに変換し、関数を適用してデータを取得する必要があります。

したがって、全体として、

var debts = storeDB.Orders.toList()
        .Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);

14


この問題は、DBモデルとビューモデルで同じ名前を持つ `[NotMapped]`プロパティからも発生します。

AutoMapperは、投影中にDBから選択しようとします。また、NotMappedプロパティは明らかにDBに存在しません。

解決策は、DBモデルからビューモデルにマッピングするときにAutoMapper設定のプロパティを「無視」することです。

  1. DBモデルで「Foo」という名前の「[NotMapped]」プロパティを探します。

  2. ビューモデルで、同じ名前のプロパティ「Foo」を探します。

  3. その場合は、AutoMapperの設定を変更してください。 Add
    .ForMember(a ⇒ a.Foo、b ⇒ b.Ignore());

13


もう1つの考えられる理由は、プロパティに「ICollection」ではなく「IEnumerable」を使用しているためです

だから代わりに:

public class This
{
    public long Id { get; set; }
    //...
    public virtual IEnumerable Thats { get; set; }
}

これを行う:

public class This
{
    public long Id { get; set; }
    //...
    public virtual ICollection Thats { get; set; }
}

そして、あなたはドキドキしています…​ 2時間以上を失う愚かなこと。

11


この状況は、unsigned intなどのEntityFramework types_ でサポートされていない _を使用している場合にも発生する可能性があります。

これはそのようなエラーの私の場合でした。

サポートされているタイプの詳細については、https://msdn.microsoft.com/en-us/library/ee382832(v = vs.100).aspxをご覧ください。

GFoley83で説明されている、このような状況に対する回避策がいくつかあります。 Entity Frameworkのlong型?]

2


この問題に直面したのは、 get *` set` *プロパティなしのメンバー変数しか持っていなかったためです

それは、「自動計算」と「テーブル」の列としての「保存されていない」ことを意味します

したがって、「テーブルスキーマ」には「存在しません」

_
したがって、「getter」および「setter」プロパティを「持つ」メンバー変数が「自動計算されない」ことを「確認」してください
_

0


タイトルとURLをコピーしました