2011-11-21 43 views
0

我是EF新手。我試圖讓Entity Framework 4.2通過計算屬性(未映射)進行排序。使用實體框架訂購子集合的動態表達式

這裏是我的實體是什麼樣子:

public class Site : Entity 
    { 
     public Site() 
     { 
      Equipments = new HashSet<Equipment>(); 
      Forecasts = new HashSet<Forecast>(); 
     } 

     [StringLength(8)] 
     public string Number { get; set; } 

     [StringLength(50)] 
     public string EquipmentShortCLLI { get; set; } 

     [StringLength(50)] 
     public string Location { get; set; } 

     public virtual Central Central { get; set; } 

     public virtual ICollection<Equipment> Equipments { get; set; } 
     public virtual ICollection<Forecast> Forecasts { get; set; } 


     #region Calculated Items 

     public bool IsEmbargo { 
      get { return Equipments.Count > 0 && Equipments.SelectMany(x => x.EquipmentDetails).Any(e => e.IsEmbargo); } 
     } 


//... 

     public int PortsCapacity 
     { 
      get 
      { 
       return Equipments.Count > 0 
          ? Equipments.SelectMany(x => x.Slots).Sum(x => x.PortsCapacity) 
          : 0; 
      } 
     } 
     #endregion 
//... 

試圖通過訂購使用我的任何只讀屬性,我得到異常: 指定的類型成員「PortsCapacity」不是在LINQ支持,以實體。僅支持初始化程序,實體成員和實體導航屬性。

這是有道理的,因爲EF試圖建立一個SQL數據庫中不存在的字段(我的理解..)。

現在,通過使用some dynamic linq code,我可以通過傳遞「Central.SomeField」(而不是使ReadOnly屬性返回Central.SomeField)來實現我的多對一列的工作。 即:

query.OrderBy("Central.SomeField"); 

不過,我仍然面臨着同樣的問題,當涉及到項目的集合(設備)。我試圖通過使用來自客戶端的字符串並避免長開關的情況儘可能地使其變爲動態的,但在這一點上,我將接受任何想法,只要排序發生在數據庫端

編輯1:

按照什麼拉吉斯拉夫Mrnka說,怎麼會在一個一對多使用lambda表達式或表達式的子項執行排序依據的條款?

回答

0

我不認爲動態Linq能夠做到這一點。您需要一個真正的Linq子查詢來計算Equipements上的聚合,因此它將無法正常工作。如果用戶選擇按IsEmbargoPortsCapacity排序,則必須有一些switch/if塊通過附加查詢的特殊部分來處理此情況 - 沒有其他方式。

+0

什麼如果我知道要排序和使用交換機按端口容量或IsEmbargo排序?基本上,我該如何編寫我的案例,知道我需要使用Linq實體進行子集合分類? –