【问题标题】:Notmapped property is not supported in LINQ to EntitiesLINQ to Entities 不支持未映射的属性
【发布时间】:2018-12-17 04:23:43
【问题描述】:

我有一个 ProUser 类,它的 ProUserContacts 是一个未映射的属性,我使用这个属性来表示由特定 proUser 创建的联系人数量:

        public class ProUser : BaseEntity
        {
            public Guid? UserId { get; set; }
            ...
            [NotMapped]
            public int ProUserContacts { get; set; }
        }

还有一个控制器来查询,然后按 ProUserContacts 对 proUser 列表进行排序:

    public IEnumerable<WebDataLayer.Models.ProUser> ListAllPaging(string sortBy)
            {
                var proUsers = _proUserService.Filter(p => !p.IsDelete);
                proUsers = proUsers.OrderBy(x => x.JoinedDay);

                foreach (var item in proUsers)
                {
                    item.ProUserContacts = CountProUserContact(item.Id);
                }

                switch (sortBy?.ToLower())
                {
                   case "prousercontact":
                        proUsers = proUsers.OrderBy(x => x.ProUserContacts);
                        break;

                  default:
                        proUsers = proUsers.OrderBy(x => x.Id);
                        break;
                }
             return proUsers;
            }

我想显示按 ProUserContacts 排序的 proUser 列表,但出现错误:LINQ to Entities 不支持指定类型成员“ProUserContacts”。仅支持初始化程序、实体成员和实体导航属性。在这一行:

proUsers = proUsers.OrderBy(x => x.ProUserContacts);

我已经尝试了相同主题推荐的几个解决方案,但当时没有奏效。 需要你的建议!!! 更新:_proUserService 的代码:这只是一组使用实体框架与数据库的连接

internal class ProUserService : EntityService<ProUser>, IProUserService
    {        
        public ProUserService(IUnitOfWork unitOfWork, IGenericRepository<ProUser> repository) : base(unitOfWork, repository)
        {     
        }

        public List<ProUser> GetProUsersByCustomerCode(string customerCode)
        {
            var proUsers = Repository.Filter(x => !x.IsDelete && x.CustomerCode.ToLower().Equals(customerCode.ToLower())).ToList();
            return proUsers;
        }
    }

【问题讨论】:

  • 您能否向我们发送更多信息,例如您在哪一行遇到错误 countprousercontact 方法中有什么内容。
  • 我刚刚更新了它@Justcode
  • 你能分享_proUserService代码吗!
  • 嗨,_proUserService 只是一个使用实体连接到数据库的类。它适用于 SQL DB 中包含的所有属性,不适用于未映射的属性@TanvirArjel。无论如何,我刚刚更新了 _proUserService 的代码
  • 因为 proUsers 是一个 IQueryable,它不能保存物化值 - 我建议在 switch 块 (List proUsersMat = null;) 之前声明一个物化列表,在切换块(使用 .ToList(),也在对未映射字段进行排序之前)并返回它而不是 IQueryable。

标签: asp.net-mvc entity-framework


【解决方案1】:

问题似乎来自此属性设置的[NotMapped] 属性:

[NotMapped]
public int ProUserContacts { get; set; }

作为共识,您不能直接在 LINQ to Entities 查询中使用任何未映射为数据库列名的属性,因为 EF 不知道如何将 ProUserContacts 转换为正确的 ORDER BY SQL 语句。您需要先使用AsEnumerable()/ToList()OrderBy() 之前实现查询:

var prusers = proUsers.ToList().OrderBy(x => x.ProUserContacts);

或通过创建IQueryable 扩展方法来使用封装,以替代直接OrderBy

public class ProUserVM
{
    public int ProUserContacts { get; set; }
}

public static IQueryable<ProUserVM> OrderByContacts(this IQueryable<ProUser> prousers)
{
    return proUsers.Select(x => new ProUserVM
    {
        // other properties
        ProUserContacts = CountProUserContact(item.Id)
    }).OrderBy(x => x.ProUserContacts);
}

// usage
proUsers = proUsers.OrderByContacts();

或删除[NotMapped] 属性并使列名基于属性名称。

参考:

Computed Properties and Entity Framework

【讨论】:

  • 他已经在服务类中的 OrderBy() 之前先使用 AsEnumerable()/ToList() 实现查询。请检查一下。
【解决方案2】:

这意味着无法评估 LINQ 查询并转换为等效的数据库查询,所以首先,您必须通过调用 AsEnumerable()ToList() 将数据加载到客户端评估然后做任何你想做的事情带有NotMapped 属性:

proUsers = proUsers.OrderBy(x => x.JoinedDay);
proUsers = proUsers.ToList().OrderBy(x => x.ProUserContacts);

阅读有关客户端与服务器评估的更多信息:https://docs.microsoft.com/en-us/ef/core/querying/client-eval

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多