Distinct()Select()更改SelectList .net Core中的类型

问题描述 投票:0回答:2

这是一个奇怪的问题,我无法找到解决方案。我正在使用.net core 2.1和最新版本的EF。我有一个这样的订单视图模型:

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

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

如果我执行通用数据库上下文,则没有问题。但是,我在SelectList中获得了重复的帐号。所以,如果我尝试做一个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()调用,但随后给了我不同的订单ID,而不是不同的帐号。这个问题似乎与Select()电话有关。

谁知道我做错了什么?

更新:我创建了AccountNumbersAccountNumbers2 SelectLists。两者都与上面完全相同,除了AccountNumbers2Select(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

c# asp.net-core .net-core
2个回答
1
投票

问题是,当您使用select时,您可以定义要返回的内容

Select(m => m.AccountNumber)

这将仅返回AccountNumber列的列表。


1
投票

本着保持项目移动的精神......

首先,我删除了Select(m => m.AccountNumber)Distinct()的任何引用,并执行以下操作:

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

我从here得到了这个想法。看来有更多的elaborate things you can do with Distinct(),我可能会稍后尝试。无论如何,我肯定会接受其他答案/批评,并添加了一个TODO以后再次访问这个...

© www.soinside.com 2019 - 2024. All rights reserved.