实体框架核心 - 多对多“阴影查询”

时间:2017-04-26 11:56:51

标签: entity-framework-core

无法想出一个好头衔,因为我不知道我要说的是什么:)

我的域名

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上定义的属性进行排序,即可以为null的Cost,我正在努力解决这个问题。在这个特殊情况下,我只关注那些主要的(至少在写这个时要求就是这样......)。

排序表达式定义为

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 - &gt;之间的零对一关系。 Youtubes - &gt;主要的,因此我可以强制说,在数据库级别最多只有一个主要通道,并且同样是对表达式树中属性的引用。

非常感谢输入

1 个答案:

答案 0 :(得分: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(); 
}