1. ホーム
  2. linq

[解決済み] イニシャライザー、エンティティメンバー、エンティティナビゲーションプロパティのみ対応

2022-11-17 19:39:12

質問

この例外が発生しました。

指定されたタイプ・メンバ 'Paid' は 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);
        }
    }

Paymentsは金額フィールドを含む関連テーブルです。Where句を削除するとクエリは動作し、支払いに関する正しい情報を表示します。

回答が示唆するように解決されました。

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

        return View(debts);
    }

どのように解決するのですか?

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

できることは、Entity に Paid フィルタなしでテーブルにクエリを実行させ、Paid でないものをフィルタリングすることです。

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サーバー上でフィルタリングを行いたい場合は、テーブル上にCalculated Columnを作成するか、Stored Procedureを使用します。