Distinct () Select () меняет тип в SelectList .net Core - PullRequest
0 голосов
/ 02 апреля 2019

Это странная проблема, и я не могу найти решение. Я использую .net Core 2.1 и последнюю версию EF. У меня есть видовая модель заказов, как это:

public class OrdersFilterViewModel
{
    public int? AccountNumber { get; set; }

    [Display(Name = "Account Numbers:")]
    public IEnumerable<SelectListItem> AccountNumbers { get; set; }
}

Если я создаю общий контекст базы данных, проблем нет. Тем не менее, я получаю повторяющиеся номера счетов в моем списке выбора. Итак, если я попытаюсь сделать Select().Distinct(), чтобы устранить дубликаты:

[Authorize]
public async Task<IActionResult> FilterOrders(int? account)
{
    var accountContext = _context.Order
        .Where(m => m.UserID == userId)
        .Select(m => m.AccountNumber)
        .Distinct();

    var vm = new OrdersFilterViewModel
    {
        ...
        AccountNumbers = new SelectList(await accountContext.ToListAsync(), "AccountNumber", "AccountNumber", account),
    }

Или я пытаюсь это:

[Authorize]
public async Task<IActionResult> FilterOrders(int? account)
{
     var accountContext = _context.Order
          .Where(m => m.UserID == userId);

      var vm = new OrdersFilterViewModel
      {
          ...
          AccountNumbers = new SelectList(await accountContext.Select(m => m.AccountNumber).Distinct().ToListAsync(), "AccountNumber", "AccountNumber", account),
      }

Независимо от того, что я пытаюсь, в том числе удалить ожидание и сделать что-то вроде этого:

AccountNumbers = new SelectList(accountContext, "AccountNumber", "AccountNumber", account).Distinct().ToList(),

Нет ошибок, но он постоянно меняет мой тип с [0] = {Microsoft.AspNetCore.Mvc.Rendering.SelectListItem} на Data = {System.Collections.ListDictionaryInternal} (который я вижу при отладке) и поэтому бомбит при переходе к представлению с:

GET https://localhost:44380/orders/filterorders?account=464402 500
send @ jquery.js:9600
ajax @ jquery.js:9206
(anonymous) @ Orders?account=464402:546
dispatch @ jquery.js:5183
elemData.handle @ jquery.js:4991
Orders?account=464402:563 Dynamic content load failed.

Однако проблема, похоже, не в вызове Distinct(), а в том, что он дает мне разные идентификаторы заказа, а не отдельные номера счетов. Похоже, проблема связана с вызовом Select().

Кто-нибудь знает, что я делаю не так?

Обновление: Я создал AccountNumbers и AccountNumbers2 SelectList с. Оба точно такие же, как указано выше, за исключением того, что AccountNumbers2 имеет Select(m => m.AccountNumber) Я даже удалил часть userId на данный момент. Итак, самое необходимое для моей проблемы:

var accountContext = _context.Account;
var accountContext2 = _context.Account.Select(m => m.AccountNumber);

...

AccountNumbers = new SelectList(await accountContext.Distinct().ToListAsync(), "AccountNumber", "AccountNumber", account),
AccountNumbers2 = new SelectList(await accountContext2.Distinct().ToListAsync(), "AccountNumber", "AccountNumber", account),

AccountNumbers: enter image description here

AccountNumbers2: enter image description here

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

В духе поддержания моего проекта в движении ...

Сначала я удалил все ссылки на Select(m => m.AccountNumber) и Distinct() и вместо этого сделал следующее:

AccountNumbers = new SelectList(await accountContext.ToListAsync(), "AccountNumber", "AccountNumber", magic)
.GroupBy(x => x.Text).Select(x => x.First()).ToList(),

Я получил идею от здесь . Похоже, есть еще сложные вещи, которые вы можете сделать с помощью Distinct () , которые я мог бы попробовать позже. В любом случае, я определенно открыт для других ответов / критики и добавил TODO, чтобы вернуться к этому позже ...

1 голос
/ 02 апреля 2019

Проблема в том, что когда вы используете select, вы определяете, что вы хотите вернуть

Select(m => m.AccountNumber)

Это вернет список только столбца AccountNumber.

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