我一直在寻找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);
}
}
我知道我不能使用未映射到数据库列的属性。那么,如果不将整个数据集复制到内存中,解决此问题的最佳方法是什么?
随意询问我是否遗漏了任何信息,或者您需要进一步解释。
提前致谢
答案 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
属性,并在计算器类中提供逻辑以计算单个实体的收入。对实体内部的计算策略具有这样的依赖性似乎违反了单一责任原则。