Entity Framework - incorrect query
Всем привет
У меня есть база данных и правильный запрос в ней:
select ledgeraccounttypeid, dateeffective, sum(amount) from ledgertransaction
where ledgeraccounttypeid in (2) and dateeffective = '2020-12-06'
group by ledgeraccounttypeid, dateeffective
Я пытаюсь сделать это с помощью EF, но я не уверен, что верно это делаю, я создал два запроса, можете подсказать какой из них верный и как его лучше поправить:
1)
var roomRevenueQuery = _reportsDbContext.LedgerTransactions.AsNoTracking().
Where(x => x.LedgerAccountTypeId.Equals(reportRequest.Input.RoomChargeIds) &&
x.DateEffective == turnedDate).GroupBy(x => x.LedgerAccountTypeId)
var roomRevenueQuery = _reportsDbContext.LedgerTransactions.AsNoTracking().
Select(x => new LedgerTransaction
{
LedgerAccountTypeId = x.???,
DateEffective = turnedDate,
Amount = x.???
}).ToList();
Первый запрос кажется правильным, однако на выходе метода мне нужно вернуть объект как во втором методе, тут и возникают проблемы
3)
var roomRevenueQuery = _reportsDbContext.LedgerTransactions.AsNoTracking()
.Where(x => x.LedgerAccountTypeId.Equals(reportRequest.Input.RoomChargeIds) &&
x.DateEffective == turnedDate)
.GroupBy(x => x.LedgerAccountTypeId)
.Select(s => new LedgerTransaction
{
LedgerAccountTypeId = s.Key,
DateEffective = turnedDate,
Amount = s.Sum(x=>x.Amount),
}).ToList();
Ответы (1 шт):
В первом коде запрос заканчивается GroupBy() - это "отложенный" метод, так что для получения объекта вам надо добавить в конец "немедленный" метод, вызывающий перечислитель, т.е. ToList(), ToArray(), ... см классификацию LINQ-методов.
Попробуйте так
class ledgertransaction // Строка таблицы в БД.
{
public int ledgeraccounttypeid;
public DateTime dateeffective;
public int AbstractValue;
}
class LedgerTransaction
{
public int ledgeraccounttypeid;
public DateTime dateeffective;
public int Amount; // of AbstractValue.
}
Имитирую таблицу в БД.
// Таблица.
List<ledgertransaction> LedgerTransactions = new List<ledgertransaction>
{
new ledgertransaction
{
ledgeraccounttypeid = 1,
dateeffective = DateTime.Now,
AbstractValue = 10
},
new ledgertransaction // *
{
ledgeraccounttypeid = 2,
dateeffective = DateTime.Now,
AbstractValue = 20
},
new ledgertransaction // *
{
ledgeraccounttypeid = 2,
dateeffective = DateTime.Now,
AbstractValue = 30
},
new ledgertransaction // *
{
ledgeraccounttypeid = 3,
dateeffective = DateTime.Now,
AbstractValue = 30
},
new ledgertransaction
{
ledgeraccounttypeid = 3,
dateeffective = DateTime.Now.AddDays(1),
AbstractValue = 40
},
};
Выбираю параметры для WHERE. Для наглядности беру не одну двойку, а 2 и 3.
DateTime searchDt = DateTime.Now;
int[] searchIds = { 2, 3 };
Делаю выборку (как в комментарии автора).
List<LedgerTransaction> result = /* _reportsDbContext. */LedgerTransactions
.Where(x => searchIds.Any(y => y == x.ledgeraccounttypeid) && x.dateeffective == searchDt)
.GroupBy(
x => new { id = x.ledgeraccounttypeid, date = x.dateeffective },
y => y.AbstractValue,
(key, value) => new LedgerTransaction
{
ledgeraccounttypeid = key.id,
dateeffective = key.date,
Amount = value.Count() // Я не знаю что именно надо в значение.
})
.ToList();
Получаю
Найденные элементы отмечены комментарием со "*" в коде List LedgerTransactions.
Если работает как надо, то проверьте этот LINQ-запрос на своей БД, внеся необходимые изменения для вашей задачи.
