2

フィルター処理された結果を取得するためにサーバーに送信する前にクエリを適切に構築するのに多くの問題があります。アイテムの基準に一致する一連の注文のみを取得するようにリファクタリングします。もちろん、エラーが発生します: 指定された型メンバー 'ReceivableQuantity' は LINQ to Entities ではサポートされていません。初期化子、エンティティ メンバー、およびエンティティ ナビゲーション プロパティのみがサポートされています。作業コードの下:

pendingOrders = from o in this.GetAll()
                where o.OrderItems.Where(i => i.ReceivableQuantity > 0).Count() > 0
                select new Order()
                {
                       OrderNumber = o.OrderNumber,
                       Comments = o.Comments,
                       FinalApprover = o.FinalApprover,
                       OrderDate = o.OrderDate,
                       Requisitioner = o.Requisitioner,
                       SupplierName = o.SupplierName,
                       ID = o.ID,
                       ShoppingCartName = o.ShoppingCartName,
                       OrderItems = (from i in o.OrderItems 
                                     where i.ReceivableQuantity > 0
                                     select i).OrderBy(i => i.LineNumber).ToList()
                };

これは、OrderItem クラスの NotMapped プロパティです。

    [NotMapped]
    public decimal ReceivableQuantity
    {
        get
        {
            if (Order == null)
                return 0;

            decimal response;
            response = this.MatchedQuantity - this.ReceivedQuantity;

            if (response >= 0)
                return response;
            else
                throw new ArgumentOutOfRangeException("Receivable Quantity must be greater than 0.");
        }
    }

MatchedQuantity と ReceivedQuantity も NotMapped プロパティなので、これは本当に拡張されていると思います。

それを使用するサイトがすでに実行されており、データベースが毎日成長しているため、コードを使用する機能が非常に遅くなっているので、私が使用すべき最善のアプローチは何ですか。

よろしくお願いします。リオ。

4

1 に答える 1

0

コードファーストマッピングを使用していると思います。このアプローチは、SQL 関数マッピングをまだサポートしていないため、高度なクエリに関してはかなり制限されています。そのため、次のオプションがあります。

  • マップされていないすべてのプロパティの計算全体を、Linq-to-entities クエリに直接入れます。これにより、クエリが非常に厄介になる可能性があります。
  • そのクエリを取り除き、2 つのストアド プロシージャを使用します。1 つ目は条件に一致するすべての注文を取得し、2 つ目は条件に一致するすべての注文のすべての注文項目を取得します。これらのストアド プロシージャは、Database.SqlQuery.
  • EF を使用せず、SQL で直接クエリを実行します。このような場合、2 つのクエリで 1 つの SQL コマンドを使用したり、2 つのクエリで 1 つのストアド プロシージャを使用したりすることもできます。
于 2013-01-02T22:49:30.003 に答える