LINQ to Entities不支持未映射的属性

时间:2018-12-17 04:23:43

标签: asp.net-mvc entity-framework

我有一个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;
        }
    }

2 个答案:

答案 0 :(得分:0)

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

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

作为共识,由于EF不知道如何将ProUserContacts转换为正确的ORDER BY SQL语句,因此不能直接在LINQ to Entities查询中使用未映射为数据库中列名称的任何属性。您需要先在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

答案 1 :(得分:0)

这意味着无法评估LINQ查询并将其转换为等效的数据库查询,因此,首先,您必须通过调用@concat('SELECT * FROM tableOnPrem WHERE dateOnPrem BETWEEN ''',variables('inidate'),''' AND ''',variables('enddate'),'''') AsEnumerable()将数据加载到客户端评估中,然后执行任何操作您想使用ToList()属性:

NotMapped

详细了解客户端与服务器评估:https://docs.microsoft.com/en-us/ef/core/querying/client-eval