Групповая ошибка при использовании IEnumerable и списка в c # - PullRequest
0 голосов
/ 02 марта 2019

Я использую контроллер API, и мне нужно вернуть список, сгруппированный по типу продукта.Я запутался с использованием IEnumerable vs List.Группа просит IEnumerable.В настоящее время я получаю синтаксическую ошибку в следующей строке в методе контроллера.

missingProducts = missingProducts.GroupBy(a => a.ProductType);

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string, Manager.WebUI.ViewModels.Allocations.MissingProductsViewModel>>' to 'System.Collections.Generic.List<Manager.WebUI.ViewModels.Allocations.MissingProductsViewModel>'. An explicit conversion exists (are you missing a cast?)

Должен ли я возвращать IEnumerable из метода в базе ApiController, а затем выполнять ToList () в методе контроллера или возвращать список из базы ApiController, а затем преобразовывать возвращаемый тип в IEnumerable из метода контроллера.

Модели

public class MISSING_PRODUCT 
{
    public int PRODUCT_ID { get; set; }
    public string PRODUCT_NAME { get; set; }
    public string PRODUCT_TYPE { get; set; }
}

public class MissingProductsViewModel
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public string ProductType { get; set; }
}

API База контроллера

public class ApiControllerBase : ApiController
{
    public List<MISSING_PRODUCT> GetMissingProducts()
    {
       var missingProduct =  
                IoC.Resolve<IPackageService>()
                    .PackageGetList<FN_MISSING_PRODUCTS, MISSING_PRODUCT>(new FN_MISSING_PRODUCTS());
        return missingProduct;
    }
 }

Метод контроллера

public class AllocationsController : ApiControllerBase
{
    [HttpGet]
    [Route("api/Allocations/{id}")]
    public IHttpActionResult Details(int id, DateTime date)
    {
        var viewModel = GetAllocationsViewModel(id, date);
        if (viewModel == null) return NotFound(); 
        return Ok(viewModel);
    }

    private AllocationsViewModel GetAllocationsViewModel(int id, DateTime date)
    {
        var ms = GetStrategy(id);
        DateTime d = new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
        if (ms.FIRM_ID != null)
        {
            var missingProducts = Mapper.Map<List<MISSING_PRODUCT>, List<MissingProductsViewModel>>(GetMissingProducts());
            missingProducts = missingProducts.GroupBy(a => a.ProductType);
            var vm = new AllocationsViewModel
            {
                MissingProducts = missingProducts
            };

            return vm;
        }

        return null;
    }
}

1 Ответ

0 голосов
/ 02 марта 2019

Я думаю, missingProducts будет иметь тип List<MissingProductsViewModel> после вызова Mapper.Map().Однако GroupBy вернет IEnumerable<IGrouping<string, MissingProductsViewModel>>.

var missingProducts = Mapper.Map<List<MISSING_PRODUCT>, List<MissingProductsViewModel>>(GetMissingProducts());
missingProducts = missingProducts.GroupBy(a => a.ProductType);

Измените вторую строку выше на эту:

missingProducts = missingProducts.GroupBy(a => a.ProductType).Select(b => b.ElementAt(0)).ToList();

И вам может потребоваться выполнить некоторую нулевую проверку.

Редактировать после комментария Тома

Ниже в строке должна быть указана недостающая продукция по названию товара:

missingProducts = missingProducts.GroupBy(a => a.ProductType).Where(b => b.Key == "PRODUCT_TYPE").SelectMany(c => c).ToList();

В этом случае вам не нужна группировка по, а вышеприведенную строку можно упростить до:

missingProducts = missingProducts.Where(a => a.ProductType == "PRODUCT_TYPE").ToList();

И не забудьте обновить жестко закодированную строку «PRODUCT_TYPE».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...