C# 如何通过EF core中的相关实体属性进行排序
您好,我想使用相关实体属性对最终结果进行排序,在本例中是局部性。我从客户端获取的关键字是一个字符串,其中包括列名和排序方向,例如“locality=asc”,但当我使用任何父实体属性执行orderby时,它运行良好。但是,具有相关实体的属性告诉我一个错误,即customer对象没有任何locality属性 这是我的班级客户和地址C# 如何通过EF core中的相关实体属性进行排序,c#,.net,asp.net-core,entity-framework-core,C#,.net,Asp.net Core,Entity Framework Core,您好,我想使用相关实体属性对最终结果进行排序,在本例中是局部性。我从客户端获取的关键字是一个字符串,其中包括列名和排序方向,例如“locality=asc”,但当我使用任何父实体属性执行orderby时,它运行良好。但是,具有相关实体的属性告诉我一个错误,即customer对象没有任何locality属性 这是我的班级客户和地址 public class Customer : IEntity { public Guid Id { get; set; } public string
public class Customer : IEntity
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
public Guid UserId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime LastUpdated { get; set; }
[ForeignKey("Address")]
public Guid AddressId { get; set; }
public virtual Address Address { get; set; }
}
public class Address: IEntity
{
public Guid Id { get; set; }
public string Lat { get; set; }
public string Lon { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Locality { get; set; }
}
在这里,我试图用地址属性(如Location)对其进行排序
int skip = (pageNum - 1) * pageSize;
if (skip < 0)
{
skip = 0;
}
searchTerm = searchTerm.ToLower();
var query = _context.Customers.Include(q => q.Address)
.Where(c => c.FirstName.ToLower().Contains(searchTerm)
|| c.LastName.ToLower().Contains(searchTerm)
|| c.Email.ToLower().Contains(searchTerm)
|| c.Mobile.ToLower().Contains(searchTerm));
//var sortOrderSplit = sortOrder.Split('=');
if (sortOrderSplit[0].ToLower() != "locality")
{
query = query.OrderByField("Email", "asc");
}
{
query = query.OrderByField("locality", "asc"); //that gives me an error because type is Address not Customer
}
var customers = query
.Skip(skip)
.Take(pageSize)
.ToList();
int skip=(pageNum-1)*页面大小;
如果(跳过<0)
{
跳过=0;
}
searchTerm=searchTerm.ToLower();
var query=\u context.Customers.Include(q=>q.Address)
.Where(c=>c.FirstName.ToLower().Contains(searchTerm)
||c.LastName.ToLower().Contains(searchTerm)
||c.Email.ToLower()包含(searchTerm)
||c.Mobile.ToLower().Contains(searchTerm));
//var sortOrderSplit=sortOrder.Split('=');
if(sortOrderSplit[0].ToLower()!=“locality”)
{
query=query.OrderByField(“电子邮件”、“asc”);
}
{
query=query.OrderByField(“locality”,“asc”);//这给了我一个错误,因为类型是Address而不是Customer
}
var客户=查询
.Skip(Skip)
.Take(页面大小)
.ToList();
如果两个实体类具有一对一关系,则必须添加
public Customer Customer { get; set; }
把你的地址也写进了课堂。
执行此操作并重试。您希望按地区ASC订购,对吗?
我认为查询的类类型是IEnumerable,所以可以使用lumbda表达式。
因为Locality在Address类中,所以应该遵循流Customer=>Address=>Locality,而不仅仅是搜索属性Locality
if (sortOrderSplit[0].ToLower() != "locality")
{
query = query.OrderBy(o => o.Email);
}
else
{
query = query.OrderBy(o => o.Address.Locality);
}
什么是排序字段?听起来像是自定义方法。必须对其进行调整以处理以点分隔的属性路径(如),这样您就可以通过类似于标准static
.OrderBy(c=>c.Address.Locality)
调用的“Address.Locality”来调用它。