繁体   English   中英

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

[英]Best way to avoid “The specified type member '*' is not supported in LINQ to Entities”

我一直在寻找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);
    }
}

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

请随时询问我是否缺少任何信息,或者您需要进一步的解释。

提前致谢

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

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属性,并且还可以在Calculator类中提供逻辑来计算单个实体的收入。 对实体内部的计算策略的这种依赖对我而言似乎违反了“单一责任原则”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM