Если бы вы разбили большой запрос на более мелкие и использовали ключевое слово var гораздо реже, то вы бы увидели свою проблему во время компиляции:
Увы, вы забыли описать свой класс PartRequisition
, Из вашего кода это выглядит примерно так:
class PartRequisition
{
public int ReferenceId {get; set;}
public int ReferenceNumber {get; set;}
public decimal? RequisitionQty {get; set;}
public decimal? RequisitionPrice {get; set;}
// one of them might be not a decimal? but a decimal.
}
Ваш код:
IQueryable<PartRequisition> result = db.partrequisitions.AsQueryable();
result = result
.Where(partRequistion => partRequisition.ReferenceID == searchModel.ReferenceNumber)
.GroupBy(partRequistion => partRequistion.ReferenceNumber)
.Select(group => group.Sum(partRequistion =>
partRequistion.RequisitionQTY * partRequistion.RequisitionPrice))
.ToList();
Давайте разделим это на более мелкие части:
IQueryable<PartRequisition> result = ...
IQueryable<PartRequisition> a = result.Where(partRequistion => ... == ...);
IQueryable<IGrouping<int, PartRequisition>> b = a.GroupBy(
partRequistion => partRequistion.ReferenceNumber);
Так что b является запрашиваемым последовательность групп. Каждая группа имеет целочисленное свойство Key. Каждая группа также представляет собой последовательность PartRequistions
, а именно все PartRequisitions
, которые имеют значение ReferenceNumber
, равное ключу.
При выборе вы берете каждую группу из своей последовательности групп. Из каждого элемента в этой группе (который является PartRequisition
) вы умножаете два свойства decimal?
, что дает нам результат decimal?
. После этого вы суммируете эти результаты, используя Sum<decimal?>
IQueryable<decimal?> c = b.Select(group => group.Sum(partRequistion =>
partRequistion.RequisitionQTY * partRequistion.RequisitionPrice)
Или еще более мелкими шагами:
- c is IQueryable> `
- Каждая группа равно
IGrouping<int, PartRequisition>
- каждая частьRequisition - это
PartRequisition
- , каждый RequisitionQTY и RequisitionPrice являются десятичными?
- результат умножения равен
decimal?
- сумма равна
decimal?
- d - IQueryable
Наконец:
List<decimal?> d = c.ToList();
result = d; // remember, result is an IQueryable<PartRequisition>
Понятно, что вы не можете назначить от List<decimal?>
до IQueryable<PartRequisition>
, что и было ошибкой:
CS0029 Невозможно неявно преобразовать тип List в DbSet
Назад к вашему задача
Вы описали класс RequistionResult
, который вы не использовали в методе GetRequisitions
. Может ли быть так, что вы не хотите возвращать IQueryable<PartRequistions>
, а IQueryable<RequisitionResult>
, где свойство RequisitionTotal
- это ваша расчетная сумма?
public IQueryable<RequisitionResult> GetRequisitions(...)
{
IQueryable<PartRequisition> partRequisitions = db.partrequisitions.AsQueryable();
if (searchModel != null)
{
if (searchModel.ReferenceNumber != 0 && searchModel.VendorID == 0)
{
partRequisitions = partRequisitions.Where(...);
}
else if (searchModel.ReferenceNumber == 0 && searchModel.VendorID != 0)
{
partRequisitions = partRequisitions.Where(...);
}
// else use all PartRequisitions
}
else
{
// TODO: decide what to return if searchModel is null, for example
partRequisitions = IQueryable.Empty<PartRequisition>();
// or use all PartRequisitions
}
// from the remaining set of PartRequisitions, convert to RequisitionResults:
IQueryable<RequisitionResult> requisitionResults = partRequisitions
.GroupBy(partRequisition => partRequisition.ReferenceNumber,
// parameter ResultSelector: take each ReferenceNumber and all PartRequisitions
// with this ReferenceNumber to make one new RequisitionResult
(referenceNumber, partRequisitionsWithThisReferenceNumber) => new RequisitionResult
{
RequisitionTotal = partRequisitionsWithThisReferenceNumber
.Select(partRequisition => partRequisition.RequisitionQty * partRequisition.RequisitionPrice)
.Sum(),
// fill other properties
...
});
return requisitionResults;
}