无法想出一个好头衔,因为我不知道我要说的是什么:)
我的域名
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;主要的,因此我可以强制说,在数据库级别最多只有一个主要通道,并且同样是对表达式树中属性的引用。
非常感谢输入
答案 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();
}