Идея состоит в том, что ссылочный номер или поставщик может быть передан в логику, и он возвращает результаты запроса для поиска. Я знаю, что что-то упускаю .. Просто не вижу этого ..

Идея SQL-запроса заключалась в следующем.

 "SELECT ReferenceNumber, VendorName, RequisitionStatus, RequestedOn, sum(RequisitionQTY*RequisitionPrice) as Total FROM partrequisition where ReferenceNumber = 105543 Group By 'ReferenceNumber' "

Кто-нибудь может помочь?

Я получаю следующую ошибку:

CS0029 Невозможно неявно преобразовать тип System.Collections.Generic.List<decimal?> в System.Data.Entity.DbSet<PartsManagement.Models.partrequisition>

(contoller)
public ActionResult Index(RequisitionSearch searchModel)
{
      var PartRequisitionInfoLogic = new PartRequisitionInfoLogic(); //This is where any business Logic goes
      var Model = PartRequisitionInfoLogic.Getpartrequisitions(searchModel); //This is where it figures out what Search Query is
      var RequisisionResults = Model.ToList();
}
(Business Logic)
private wsdpartsmanagementEntities9 db = new wsdpartsmanagementEntities9();

public IQueryable<partrequisition> Getpartrequisitions(RequisitionSearch searchModel)
{

    var result = db.partrequisitions.AsQueryable();

    if (searchModel != null)
    {

        if (searchModel.ReferenceNumber != 0 && searchModel.VendorID == 0)

            result = result.Where(c => c.ReferenceNumber == searchModel.ReferenceNumber).GroupBy(c => c.ReferenceNumber)
                        .Select(g => g.Sum(item => item.RequisitionQTY * item.RequisitionPrice)) // For each group, calculate the sum
                        .ToList();

            if (searchModel.ReferenceNumber == 0 && searchModel.VendorID != 0)

                result = result.Where(c => c.VendorName == searchModel.VendorID).GroupBy(c => c.ReferenceNumber)
                        .Select(g => g.Sum(item => item.RequisitionQTY * item.RequisitionPrice))// For each group, calculate the sum
                        .ToList();
        }


        return result;
}
(ViewModel(s))
    public class RequisitionSearch
    {
        public int? VendorID { get; set; }
        public int? ReferenceNumber { get; set; }
        public List<RequisitionResults> SearchResults { get; set; }

        public RequisitionSearch()
        {
            this.SearchResults = new List<RequisitionResults>();
        }
    }
}

public class RequisitionResults
    {
        public int ReferenceID { get; set; }
        [Display(Name = "Reference Number")]
        public int ReferenceNumber { get; set; }
        [Display(Name = "Vendor Name")]
        public string VendorName { get; set; }
        [Display(Name = "Requisition Status")]
        public string RequisitionStatus { get; set; }
        [Display(Name = "Requisition On")]
        public DateTime RequestedOn { get; set; }
        [DisplayFormat(DataFormatString = "{0:C}")]
        [Display(Name = "Requisition Total")]
        public decimal RequisitionTotal { get; set; }

    }

Обновить. Решением было удалить бизнес-логику и заменить ее (ниже) в ActionResult. Работает отлично.

var result = db.partrequisitions.AsQueryable();
if (searchModel.ReferenceNumber != null || searchModel.VendorID != null)
 {
   result = result.Where(partrequisition => partrequisition.ReferenceNumber == searchModel.ReferenceNumber || partrequisition.VendorName == searchModel.VendorID);
 }
 else
 {
    result = result.Distinct();
 }            

 var b = result.GroupBy(x => x.ReferenceNumber);
 var c = b.Select(group => group.Sum(partRequistion => partRequistion.RequisitionQTY * partRequistion.RequisitionPrice));

И для доступа к информации о запросе пара циклов foreach.

-1
user474848 28 Апр 2020 в 07:28

2 ответа

Лучший ответ

Если бы вы разбили большой запрос на более мелкие и использовали ключевое слово 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, равное ключу.

В Select вы берете каждую группу из вашей последовательности групп. Из каждого элемента в этой группе (который является PartRequisition) вы умножаете два decimal? свойства, что дает нам результат decimal?. После этого вы суммируете эти результаты, используя Sum<decimal?>

IQueryable<decimal?> c = b.Select(group => group.Sum(partRequistion =>
    partRequistion.RequisitionQTY * partRequistion.RequisitionPrice)

Или еще меньшими шагами:

  • c IQueryable> `
  • Каждая группа IGrouping<int, PartRequisition>
  • каждый partRequisition является PartRequisition
  • Кол-во каждого реквизиции и цена реквизиции являются десятичными?
  • результат умножения равен decimal?
  • результат суммы decimal?
  • я могу спросить

В заключение:

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;
}
0
Harald Coppoolse 28 Апр 2020 в 08:52

Внимательно посмотрите на следующую строку:

 result = result.Where(c => c.VendorName == searchModel.VendorID)
                .GroupBy(c => c.ReferenceNumber)
                .Select(g => g.Sum(item => item.RequisitionQTY * item.RequisitionPrice))// For each group, calculate the sum
                .ToList();

Вы пытаетесь вернуть значения List Decimal?, используя метод Sum, а тип возвращаемого вами метода - IQueryable<partrequisition>. Так что вам нужно либо изменить тип возвращаемого вами метода на List из Decimals?, либо изменить свой запрос, чтобы выполнить то, что на самом деле нужно вашему методу, вернув IQueryable из {{X7} } .

1
Salah Akbari 28 Апр 2020 в 06:45