У меня этот linq to sql работает (после помощи этой группы)

var resultTotal = (from fuf in db.fad_userFoods
              join fu in db.fad_user on fuf.userID equals fu.userID
              join ff in db.fad_food on fuf.foodID equals ff.foodID 
              where fuf.userID == thisGuid && fuf.quantityAmount >= ff.portionSize
              group fuf.userID by new {fu.dateJoined} into g
              select new AccountHomeViewModel
              {
                totalPercent = (g.Count() / (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now) * 5.0)) * 100,
                totalPortionsPossible = (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now)+1)*5,
                totalPortionsAchieved = g.Count()
              }).First();

Теперь я хочу получить некоторые рассчитанные значения в моем «выборе новой модели AccountHomeViewModel».

Итак, я изменил linq на sql следующим образом:

var resultTotal = (from fuf in db.fad_userFoods
              join fu in db.fad_user on fuf.userID equals fu.userID
              join ff in db.fad_food on fuf.foodID equals ff.foodID 
              where fuf.userID == thisGuid && fuf.quantityAmount >= ff.portionSize
              group fuf.userID by new {fu.dateJoined, fuf.quantityAmount, ff.portionSize} into g
              select new AccountHomeViewModel
              {
                totalPercent = (g.Count() / (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now) * 5.0)) * 100,
                totalPortionsPossible = (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now)+1)*5,
                totalPortionsAchieved = g.Count(),
                calcValue = g.Sum(g.Key.quantityAmount)/g.Sum(g.Key.portionSize)
              }).First();

Но я получаю ошибку intellisense в Visual Studio 2015 в обеих частях g.Sum:

Argument 2: cannot convert from 'decimal?' to 'System.Func<System.Guid?, int>'

Я вижу это потому, что группирую по fuf.userID, который является GUID. Но почему это влияет на мою СУММ, а не на КОЛИЧЕСТВО?

Я знаю, что это мое непонимание (это мое первое приложение MVC и linq-to-sql), но где мне искать, чтобы исправить эту проблему?

Заранее спасибо.

0
stumcc 18 Фев 2016 в 16:25

2 ответа

Лучший ответ

Вы только возвращаете fuf.userID из своего group by, одновременно суммируя свойство, по которому вы группируете. Таким образом, любая попытка доступа к десятичной дроби quantityAmount в агрегатной функции в вашем select потерпит неудачу. Пытаться:

var resultTotal = (from fuf in db.fad_userFoods
          join fu in db.fad_user on fuf.userID equals fu.userID
          join ff in db.fad_food on fuf.foodID equals ff.foodID 
          where fuf.userID == thisGuid && fuf.quantityAmount >= ff.portionSize
          group new {fuf.userID, fuf.quantityAmount, ff.portionSize} by new {fu.dateJoined} into g
          select new AccountHomeViewModel
          {
            totalPercent = (g.Count() / (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now) * 5.0)) * 100,
            totalPortionsPossible = (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now)+1)*5,
            totalPortionsAchieved = g.Count(),
            calcValue = g.Sum(q => q.quantityAmount)/g.Sum(q => q.portionSize)
          }).First();

Это LINQ, который должен привести к необходимому вам T-SQL (согласно комментариям ниже):

var resultTotal = (from fap in db.fad_user_physician
          join fu in db.fad_user on fup.userID equals fu.userID
          join fuf in db.fad_userFoods on fu.userID equals fuf.userID
          join ff in db.fad_food on fuf.foodID equals ff.foodID 
          where fup.physicianID == thisGuid && fuf.quantityAmount >= ff.portionSize
          group new {fuf.quantityAmount, ff.portionSize, ff.alwaysOnePortion} by new {fuf.userId, fu.dateJoined} into g
          select new AccountHomeViewModel
          {
            totalPercent = (g.Count() / (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now) * 5.0)) * 100,
            calcValue = g.Sum(q => q.alwaysOnePortion == true ? 1: q.quantityAmount/q.portionSize)
          }).First();
1
strickt01 18 Фев 2016 в 15:50

Вы можете попробовать использовать.

   var resultTotal = (from fuf in db.fad_userFoods
      join fu in db.fad_user on fuf.userID equals fu.userID
      join ff in db.fad_food on fuf.foodID equals ff.foodID 
      where fuf.userID == thisGuid && fuf.quantityAmount >= ff.portionSize
      group new {Uid=fuf.userID,Qa=fuf.quantityAmount,Ps=ff.portionSize} by new {fu.dateJoined} into g
      select new AccountHomeViewModel
      {
        totalPercent = (g.Count() / (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now) * 5.0)) * 100,
        totalPortionsPossible = (DbFunctions.DiffDays(g.Key.dateJoined, DateTime.Now)+1)*5,
        totalPortionsAchieved = g.Count(),
        calcValue = g.Select(d=>d.Qa).Sum()/g.Select(d=>d.Ps).Sum()
      }).First();

изменить попробуйте изменить calcValue на

    calcValue = g.Select(d=>d.Qa).Sum()/g.Select(d=>(d.Qa>d.Ps?d.Qa:d.Ps)).Sum()

Надеюсь, это поможет тебе.

1
Viplock 18 Фев 2016 в 15:18