Я пытаюсь скопировать этот запрос на соединение в linq. Но я не понимаю, где добавить группу и порядок операторов.
select
c.CheckID,cv.Earnings
FROM
[Customers0].[pay].[CheckVendorCalc] as cv
inner join [Customers0].[pay].[Checks] as c on cv.checkid = c.checkid
where
c.CheckDate BETWEEN '2022-01-01'
AND '2022-12-31'
and c.CustomerID = 360
and c.EmployeeCode = '01'
and (
cv.TaxableEarnings != null
or cv.TaxableEarnings != 0)
group by
c.CheckID,cv.Earnings
order by
c.CheckID
var v1 = (from cv in db.CheckVendorCalcs
join c in db.Checks on cv.CheckID equals c.CheckID
where (c.CheckDate >= YTDStartDate && c.CheckDate <= YTDEndtDate && c.CustomerID == CustomerID && c.EmployeeCode == e.EmployeeCode && (cv.TaxableEarnings != null || cv.TaxableEarnings != 0)
select new { c.CheckID, cv.Earnings }).ToList();
Возможно, вам поможет мой рецепт SQL to LINQ.
Вы можете просто сделать GroupBy и OrderBy перед ToList():
var v1 = (
from cv in db.CheckVendorCalcs
join c in db.Checks on cv.CheckID equals c.CheckID
where c.CheckDate >= YTDStartDate && c.CheckDate <= YTDEndtDate
&& c.CustomerID == CustomerID && c.EmployeeCode == e.EmployeeCode
&& (cv.TaxableEarnings != null || cv.TaxableEarnings != 0)
select new { c.CheckID, cv.Earnings })
.GroupBy(x=>x.CheckID).ThenBy(x=>x.Earnings)
.OrderBy(x=>x.CheckID).ToList();
'IQueryable<IGrouping<int, <анонимный тип: int CheckID, decimal? Earnings>>>» не содержит определения для «ThenBy» и нет доступного метода расширения «ThenBy», принимающего первый аргумент типа «IQueryable<IGrouping<int, <anonymous type: int CheckID, decimal? Earnings>>>' может быть найден (вам не хватает директивы using или ссылки на сборку?)
могу ли я использовать distict() вместо groupby?
После запроса:
.GroupBy()
для группировки по столбцам CheckID
и Earnings
.CheckID
.var v1 = (from cv in db.CheckVendorCalcs
join c in db.Checks on cv.CheckID equals c.CheckID
where (c.CheckDate >= YTDStartDate && c.CheckDate <= YTDEndtDate)
&& c.CustomerID == CustomerID
&& c.EmployeeCode == e.EmployeeCode
&& (cv.TaxableEarnings != null || cv.TaxableEarnings != 0)
select new { c.CheckID, cv.Earnings }
)
.GroupBy(x => new { x.CheckID, x.Earnings })
.Select(g => new { g.Key.CheckID, g.Key.Earnings })
.OrderBy(x => x.CheckID)
.ToList();
Готово, обновите ответ. Думаю, указать свойства будет безопаснее.
Попробуйте следующий запрос:
var query =
from cv in db.CheckVendorCalcs
join c in db.Checks on cv.CheckID equals c.CheckID
where (c.CheckDate >= YTDStartDate && c.CheckDate <= YTDEndtDate && c.CustomerID == CustomerID
&& c.EmployeeCode == e.EmployeeCode && (cv.TaxableEarnings != null || cv.TaxableEarnings != 0)
group c by new { c.CheckID, cv.Earnings } into g
orderby g.Key.CheckID
select new
{
g.Key.CheckID,
g.Key.Earnings
};
Также orderby
можно поставить после проекции:
var query =
...
group c by new { c.CheckID, cv.Earnings } into g
select new
{
g.Key.CheckID,
g.Key.Earnings
} into s
orderby s.CheckID
select s;
Для отладочных вопросов требуется минимальный воспроизводимый пример . Как спросить Справочный центр