如何解决具有期望的Linq:在此上下文中仅支持原始类型或枚举类型
我有这个例子:无法创建类型为.... viewmodels.Yarn.FilterNameDto'的常量值。在这种情况下,仅支持基本类型或枚举类型。
viewmodels
public class YarnListviewmodel
{
public YarnListFilter YarnListFilter { get; set; }
public IEnumerable<FilterNameDto> FilterNames { get; set; }
}
public class YarnListFilter
{
public int? BrandId { get; set; }
public string ProductName { get; set; }
}
public class FilterNameDto
{
public string ProductName { get; set; }
}
在Contoller中:
List<FilterNameDto> nlnames = new List<FilterNameDto>
{
new FilterNameDto { ProductName = "Farouche" },new FilterNameDto { ProductName = "La Parisienne" },...
};
var filternamesdb = _context.YarnFullAdmins
.Where(n => n.ProductName != null)
.GroupBy(n => n.ProductName)
.Select(n => n.FirstOrDefault());
if (yarnListFilter.BrandId > 0)
filternamesdb = filternamesdb.Where(b => b.BrandId == yarnListFilter.BrandId);
// Until here everything works fine
var filternamesdblist = filternamesdb.Select(n => new FilterNameDto
{
ProductName = n.ProductName,}).Except(nlnames).ToList(); // I remove the names who are in the nlnames list
nlnames.AddRange(filternamesdblist); // And I add them so they come out first
var filternames = filternamesdblist;
if (yarnListFilter.BrandId == null || yarnListFilter.BrandId == 1)
filternames = nlnames;
var viewmodel = new YarnListviewmodel
{
FilterNames = filternames
};
return View(viewmodel);
.exept是我的问题!
查看:
@Html.DropDownListFor(f => f.YarnListFilter.ProductName,new SelectList(Model.FilterNames,"ProductName","ProductName"),"Filter by Name",new { @class = "form-control",@onchange = "this.form.submit();" })
我的目标是让某些在查询结果中(此列表中的每个地方)实际出现的项(在nlnames列表中引用)首先出现。所以,我想我将它们从列表中删除,然后添加它们,以便将它们首先列出。 还是有(而且我肯定有)实现这一目标的更好方法?!?!?
要清晰简短地恢复,请执行以下操作: 数据库返回Aaa,Bbb,Ccc,Ddd,Eee 我希望Bbb,Ddd成为第一! 预先感谢您的帮助。
解决方法
问题在于您的对象nlnames
无法转换为SQL Server可以理解的内容。为了解决这个问题,您可以在.ToList()
.Except()
var filternamesdblist = filternamesdb
.Select(n => new FilterNameDto
{
ProductName = n.ProductName,})
.ToList()
.Where(n => !nlnames.Any(nl => nl.ProductName == n.ProductName))
.ToList();
或者,您可以将nlnames
的类型更改为List<string>
,SQL Server可以理解:
var nlnames = new List<string> { "Farouche","La Parisienne" };
var filternamesdblist = filternamesdb
.Where(n => !nlnames.Contains(n.ProductName))
.Select(n => new FilterNameDto
{
ProductName = n.ProductName,})
.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。