我有一个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;
}
}
答案 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]
属性,并根据属性名称创建列名称。
参考:
答案 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