2013-07-19 49 views
0

我開始與EF,並有這個問題,當我想有一個投影在LINQ到實體查詢投影和調用方法,「指定類型成員'成員'不支持在LINQ to實體」

原始實體

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是不支持的實體。只有初始化,實體成員和實體導航屬性都支持

現在的問題是:

有什麼辦法,我可以使用從RealClass的財產總價值在至極我無法獲得全部的RealClass屬性然後進行投影? (這是不好的,因爲該實體是巨大的,我只需要在網格中顯示3列)。

謝謝!

PS:對不起我的英語!

回答

1

EF不知道如何將您的自定義屬性轉換爲SQL。

相反,您可以在查詢中間調用AsEnumerable()以強制其餘部分在客戶端上運行。

+0

我知道你的意思,但我不希望調用AsEnumerable()因爲這樣,查詢將從數據庫中獲取所有數據,並且我只需要這四個屬性在一個只讀的網格中顯示。 – Ricardo

+0

@Ricardo:然後你可以使用兩個'select'子句;一個在服務器上,另一個在客戶端上。 – SLaks

+0

你能給我一些小例子嗎?我正在嘗試,但無濟於事 – Ricardo

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(); 
+0

謝謝,這將是我的最後手段,如果我不能使其工作在其他方式 – Ricardo

相關問題