投影和调用方法,“LINQ to Entities中不支持指定的类型成员'成员'

时间:2013-07-19 15:49:06

标签: c# entity-framework linq-to-entities

我从EF开始,当我想在linq-to-entities查询中进行投影时遇到此问题

原始实体

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:对不起我的英文!

2 个答案:

答案 0 :(得分:1)

EF不知道如何将自定义属性转换为SQL。

相反,您可以在查询中间调用AsEnumerable()以强制其余部分在客户端上运行。

答案 1 :(得分:0)

更好的解决方案是将你的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();