我从EF开始,当我想在linq中对实体查询进行投影时,会遇到这个问题
原始实体
public class RealClass {
public int Id {get; set;}
public string Description {get; set;}
public decimal ValueOne {get; set;}
public decimal ValueTwo {get; set;}
// Other 100 properties..
public decimal TotalValue {
get
{
return this.ValueOne + this.ValueTwo; // It's an example, in my real object it is a little more complex and involves more properties
}
}
}
另外,我有这样的东西:
public class LittleClass {
public int LittleId {get; set;}
public string LittleDescription {get; set;}
public decimal LittleTotalValue {get; set;}
}
在我的存储库中,我想做这样的事情:
public IList<LittleClass> GetAllLittleClass {
return myContext.Set<RealClass>().AsNotracking().Select(x => new LittleClass
{
LittleId = x.Id,
LittleDescription = x.Description ,
LittleTotalValue = x.TotalValue // Here is the error!
}).ToList();
}
我得到以下错误
LINQ to Entities中不支持指定的类型成员"TotalValue"。只支持初始化程序、实体成员和实体导航属性
现在的问题是:
有没有什么方法可以使用RealClass中的属性TotalValue,这样我就可以不获取所有RealClass属性,然后进行投影?(这不好,因为那个实体很大,我只需要在一个网格中显示3列)。
谢谢!
PS:对不起我的英语!
相反,您可以在查询的中间调用AsEnumerable()
,以强制查询的其余部分在客户端上运行。
更好的解决方案是将getter和两个属性移动到LittleClass:
public class LittleClass {
public int LittleId {get; set;}
public string LittleDescription {get; set;}
public decimal ValueOne {get; set;}
public decimal ValueTwo {get; set;}
public decimal LittleTotalValue
{
get
{
return this.ValueOne + this.ValueTwo;
}
}
}
并且在您的存储库中:
return myContext.Set<RealClass>().AsNotracking().Select(x => new LittleClass
{
LittleId = x.Id,
LittleDescription = x.Description ,
ValueOne = x.ValueOne,
ValueTwo = x.ValueTwo
}).ToList();