0

この問題に対する最善の解決策をStackoverflowで検索してきました:

「指定された型メンバー 'Income' は、LINQ to Entities ではサポートされていません。初期化子、エンティティ メンバー、およびエンティティ ナビゲーション プロパティのみがサポートされています。」

データセット全体をメモリにコピーして操作することは避けたいです。私が現在使用しているコードは、AsEnumerable の使用 (ローカル メモリへのコピー) を避けたい場合に、次のようになります。

from refs in entities.ReferralSet 
    where refs.ReferralSince >= fromDate 
    && (refs.ReferralTill ?? DateTime.Today) <= toDate 
    select refs).AsEnumerable().Sum(o => o.Income

使用される収入コード:

    public double Income
    {
    get
    {
        MembershipType type = /* bla bla bla */
        return Click.Count * CalculateBAL.ReferralEarningClick(type);
    }
}

データベース列にマップされていないプロパティを使用できないことはわかっています。では、データセット全体をメモリにコピーせずにこの問題を回避する最善の方法は何でしょうか?

情報が不足している場合や、さらに説明が必要な場合は、お気軽にお問い合わせください。

前もって感謝します

4

1 に答える 1

0

エンティティをメモリにロードしたくない場合や、Incomeプロパティのロジックを SQL で再現して、計算されてからマップされたデータベース列を作成できない場合は、できることはあまりありません。私が見る唯一のオプションは、計算を実行するために必要な最小値まで、ロードされるデータの量を可能な限り減らすことです-たとえば、ヘルパープロパティを作成することによって...

public class IncomeCalculationData
{
    public int X { get; set; }
    public double Y { get; set; }
    //...
}

...完全なエンティティではなく、必要なプロパティのみをロードするプロジェクションを使用して...

var incomeCalculationDataList =
    from refs in entities.ReferralSet 
    where refs.ReferralSince >= fromDate 
        && (refs.ReferralTill ?? DateTime.Today) <= toDate 
    select new IncomeCalculationData { X = refs.X, Y = refs.Y, /* ... */ };

...そして「電卓クラス」とメソッド(おそらくCalculateBALこの目的に役立つかもしれません):

public double CalculateIncomeSum(IEnumerable<IncomeCalculationData> data)
{
    return data.Sum(d => { ... }); // your logic based on d.X and d.Y, etc.
}

次のように呼び出されます。

var incomeSum = CalculateBAL.CalculateIncomeSum(incomeCalculationDataList);

Incomeエンティティからプロパティを完全に削除し、電卓クラスにロジックを提供して、単一のエンティティの収入を計算することを検討できます。エンティティ内の計算戦略にそのような依存関係を持つことは、私には単一責任の原則に違反しているように見えます。

于 2013-07-12T21:58:14.940 に答える