避免“LINQ to Entities”中不支持“指定的类型成员'*'的最佳方法

时间:2013-07-12 21:22:17

标签: c# sql entity-framework entity

我一直在寻找Stackoverflow来解决这个问题的最佳解决方案:

  

“LINQ to Entities不支持指定的类型成员'Income'。仅支持初始值设定项,实体成员和实体导航属性。”

我想避免将整个数据集复制到内存中来操作它。我现在使用的代码看起来像这样,我想避免使用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);
    }
}

我知道我不能使用未映射到数据库列的属性。那么,如果不将整个数据集复制到内存中,解决此问题的最佳方法是什么?

随意询问我是否遗漏了任何信息,或者您需要进一步解释。

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您不想将实体加载到内存中,并且如果您无法在SQL中重现Income属性的逻辑来创建计算 - 然后映射 - 数据库列,则不会你可以做多少。我将看到的唯一选择是尽可能减少加载数据量,使其达到执行计算所需的最小值 - 例如,通过创建辅助属性...

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属性,并在计算器类中提供逻辑以计算单个实体的收入。对实体内部的计算策略具有这样的依赖性似乎违反了单一责任原则。