2017-04-26 245 views
1

無法想出一個好標題,因爲我不知道的名字我後:)實體框架的核心 - 許多一對多「影子查詢」

我的域名

public class Profile 
{ 
    public int Id { get; set } 

    // Many-to-many using CLR join class 
    public virtual IList<Youtubes> Youtubes { get; set; } 
} 

public class Youtubes 
{ 
    public int YoutubeId { get; set; } 
    public int ProfileId { get; set; } 
    public bool IsPrimary { get; set; } 
    // Virtual properties omitted 
} 

只有一個通道可以被標記爲IsPrimary(這是不可能在數據庫級別使用當前設計強制執行:)。

我有一個需求,我需要對Youtube上定義的屬性進行排序,即Cost是可以爲空的int,我正在努力完成這項工作。在這種特殊情況下,我只關心那些主要的(至少在寫這篇文章時這種要求是這樣的)。

排序表達式定義爲

public Expression<Func<Profile, int>> Exp() 
{ 
    return p => (p.Blog.Cost ?? 0) + (p.Instagram.Cost ?? 0) + 
      (p.Youtube.Cost ?? 0); // This was prior to adding many-to-many 
} 

我想要做的就是

public Expression<Func<Profile, int>> Exp() 
{ 
    return p => (p.Blog.Cost ?? 0) + (p.Instagram.Cost ?? 0) + 
      (p.Youtubes.FirstOrDefault(y => i.IsPrimary)?.Cost ?? 0); 
} 

但是,這是不允許的表達式樹內。那麼如何解決這個問題呢?

目前傾向於創建一個ProfileYouTubePrimary,它將建立Profile - > Youtubes - > Primary之間的零對一關係,因此我可以強制在數據庫級別最多有一個主要通道,並且在相同我的表達式樹中的屬性的引用。

輸入greately讚賞

回答

2

嗯,這不是那麼簡潔,但你可以Where + Select + FirstOrDefault(沒有謂詞版本)替換它:

public Expression<Func<Profile, int>> Exp() 
{ 
    return p => (p.Blog.Cost ?? 0) + (p.Instagram.Cost ?? 0) + 
     p.Youtubes.Where(y => y.IsPrimary).Select(y => y.Cost ?? 0).FirstOrDefault(); 
} 
+1

我怎麼能錯過 - 謝謝! – joacar