微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有期望的Linq:在此上下文中仅支持原始类型或枚举类型

如何解决具有期望的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 举报,一经查实,本站将立刻删除。