我有一个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 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();
或者删除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