繁体   English   中英

如何使用 EF 核心中的相关实体属性进行排序

[英]How to order by with related entity properties in EF core

您好,我想使用相关实体属性对最终结果进行排序,在本例中为 Locality。 我从客户端获取关键字作为包含列名和排序方向的字符串,例如。 “locality=asc”,但是当我对任何父实体属性进行排序时,它运行正常,但是具有相关实体的属性给了我一个错误,说客户 object 没有任何位置属性

这是我的 class 客户和地址

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

在这里,我尝试使用地址属性(例如位置)对其进行排序

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();

你想通过 Locality ASC 订购,对吗?
我认为 Class 类型的查询是 IEnumerable,所以你可以使用 lumbda 表达式。
因为Locality在地址Class,应该按照流程Customer => Address => Locality,不能只搜索属性Locality。

if (sortOrderSplit[0].ToLower() != "locality")
{
    query = query.OrderBy(o => o.Email);
}
else
{
    query = query.OrderBy(o => o.Address.Locality);
}

如果您的两个实体类具有一对一的关系,则必须添加

public Customer Customer { get; set; }

也进入您的地址 class 。 这样做并再试一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM