这种奇怪的问题,我想不出解决方案。我正在使用.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()
通话有关。
有人知道我在做什么错吗?
更新:我创建了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),
答案 0 :(得分:1)
问题在于,当您使用select时,您要定义要返回的内容
Select(m => m.AccountNumber)
这将仅返回AccountNumber列的列表。
答案 1 :(得分: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
以供日后再次使用...