TheSniper105 Ответов: 1

Перевести SQL в linq to entites C#


Здравствуйте, мне нужно перевести следующий sql в linq to entites c# iam с помощью EF 6


SELECT  ProductID, BillType, SUM(PermitQuantity) AS quantity,  BillDate  = DATEADD(MONTH, DATEDIFF(MONTH, 0, BillDate), 0)
 FROM  ViewRpt_ProductsTrans
 WHERE BillType IN (2,3)
 AND  ProductCode='79'
 AND BillIsPermitted= 1
 GROUP BY  DATEADD(MONTH, DATEDIFF(MONTH, 0, BillDate), 0),ProductID,BillType
 ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, BillDate), 0)


я не могу перевести следующую часть
DATEADD(MONTH, DATEDIFF(MONTH, 0, BillDate), 0)


Что я уже пробовал:

var trans = (from p in _context.ViewRpt_ProductsTrans
                        let groupDate = new DateTime(p.BillDate.Value.Year, p.BillDate.Value.Month, 0, 0, 0, 0)
                        where
                                p.ProductID == productId &&
                                p.BillIsPermitted == true &&
                                (p.BillType == 3 || p.BillType == 2)
                        group p by
                        new
                        {
                            p.ProductID,
                            p.BranchID,
                            p.BillType,
                            groupDate
                        } into g

                        select new BranchesProductTransViewModel()
                        {
                            BillDate = g.Key.groupDate,
                            BillType = g.Key.BillType.Value,
                            BranchId = g.Key.BranchID.Value,
                            ProductId = g.Key.ProductID,
                            Quantity = g.Sum(x => x.PermitQuantity).GetValueOrDefault(0)
                        });

Thanks7872

Взгляните на это : https://stackoverflow.com/a/11665220

В основном он используется для поиска начала месяца, в котором находится дата счета.

1 Ответов

Рейтинг:
8

Richard Deeming

Что-то вроде этого должно сработать:

let groupDate = DbFunctions.AddMonths(new DateTime(1753, 1, 1), EntityFunctions.DiffMonths(new DateTime(1753, 1, 1), p.BillDate))
(Использование пространства имен System.Data.Entity)

Или:
let groupDate = SqlFunctions.DateAdd("month", SqlFunctions.DateDiff("month", new DateTime(1753, 1, 1), p.BillDate), new DateTime(1753, 1, 1))
(Использование пространства имен System.Data.Entity.SqlServer)

Главное различие между ними заключается в том, что SqlFunctions работает только для SQL Server, тогда как EntityFunctions должно работать и для других поставщиков.

NB: 1 января 1753 года-самая ранняя дата, поддерживаемая SQL datetime тип. Если вы используете SQL 2008 или более позднюю версию, ваши столбцы должны быть определены следующим образом datetime2, в этом случае вы могли бы использовать DateTime.MinValue вместо.


TheSniper105

спасибо Вам очень много работало на меня я иду на первое решение так как использую другого провайдера
но только одно замечание замените EntityFunctions на DbFunctions так как первая уже устарела

Richard Deeming

Спасибо за обновление-я не заметил Obsolete атрибут.