LINQ to Entities中不支持Notmapped属性



我有一个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中不支持指定的类型成员"ProUserContact"。仅支持初始值设定项、实体成员和实体导航属性在这一行:

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

我尝试过一些相同主题推荐的解决方案,但当时都不起作用。需要你的建议!!!UPDATE:_proUserService的代码:这只是一组使用实体框架到DB的连接

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;
}
}

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

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

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

或者删除CCD_ 9属性,使列名基于属性名。

参考:

计算属性和实体框架

这意味着LINQ查询无法评估并转换为等效的数据库查询,因此首先,您必须通过调用AsEnumerable()ToList()将数据加载到客户端评估,然后对NotMapped属性执行任何您想做的操作:

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

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

最新更新