如何使用Linq将实体的bool转换为数值(int或decimal)?

时间:2016-03-01 13:40:57

标签: c# casting linq-to-entities

我正在加入一个{uniqueidentifier ID,bool IsRead)。我想计算读者人数,所以我这样做:

inbox.GroupJoin(
    isRead,
    p => p.ID,
    r => r.ID,
    (p, r) => new {ID = p.ID, ReadRate = r.Sum( x => x.IsRead ) / (decimal)r.Count() }
)

那不能编译,因为它不能求和布尔值。我需要将Sum函数的IsRead属性转换为小数,但我担心使用的强制转换方法的性能。

  • 我可以在Sum调用中使用x => x.IsRead ? 1 : 0,但我认为条件不合适。
  • Linq2Entities无法识别
  • x => Convert.ToDecimal(根据我的理解,我不支持Convert.*。)
  • 使用(int)进行直接投射不适用于C#中的布尔值。
  • r.Cast<decimal>()无法使用,因为它没有像Sum这样的选择器,因此我无法在没有额外工作的情况下从对象中选择IsRead属性。
  • 我可以使用r.Select( x => x.IsRead ).Cast<decimal>().Sum(),但我真的需要Select吗?
  • 我可以更快地将布尔值转换为整数,但我不确定如何在早期联接中的赋值点处执行此操作,它看起来像(a,b) => new {ID = a.ID, IsRead = b.IsRead}

1 个答案:

答案 0 :(得分:1)

可能会解决您的问题:更改

r.Sum( x => x.IsRead )

r.Count( x => x.IsRead )