OData中一对多导航属性上的$orderby

OData中一对多导航属性上的$orderby,odata,asp.net-web-api2,Odata,Asp.net Web Api2,正在寻找使用WebApi2下的OData v4在一对多导航属性上执行$orderby的方法。例如,一个典型的联系人和地址场景,其中存在一对多 public class Contact { public int ContactId { get; set; } public String FirstName { get; set; } public virtual ICollection<ContactAddress> Addresses { get; set;

正在寻找使用WebApi2下的OData v4在一对多导航属性上执行$orderby的方法。例如,一个典型的联系人和地址场景,其中存在一对多

public class Contact
{
    public int ContactId { get; set; }
    public String FirstName { get; set; }
    public virtual ICollection<ContactAddress> Addresses { get; set; }
}

public class ContactAddress
{
    public int ContactAddressId { get; set; }
    public int ContactId { get; set; }
    public virtual Contact Contact { get; set; }
    public String AddressOne { get; set; }
    public String StateCode { get; set; }
    public bool IsPreferred { get; set; }
    public String Type { get; set; }
    public bool IsActive { get; set; }
}
只是我不清楚我需要在实际的实体或控制器上做些什么才能使这些工作正常进行。我得到一个运行时异常,因为PreferredAddress在任何地方都不存在。但这似乎是最有效的方法

我可能可以用DTO/可查询的方法来处理事情,但这似乎真的很不幸,而且需要做很多额外的工作


有没有解决这个问题的实用方法???

关于orderby的问题,OData不支持在$orderby中包含另一个查询选项。我的建议是,您首先查询所有地址eq'Smith'&$expand=地址,然后在客户端添加您自己的逻辑来排序地址。Layla,谢谢。最后,我把OData从项目中拉了出来。这段经历相当令人沮丧,我开始怀疑这种方法是否明智。我能够在查询字符串中实现更简单的语义相关性,并在服务器端使用LinqKit/PredicateBuilder来完成我所需要的。这有很多优点,并且不需要像您建议的那样的变通方法。坦率地说,它是一个大型数据集,因此将其全部提交给客户机进行排序无论如何都是不可接受的。但我很感激你的回应。
        builder.EntitySet<Contact>("ODataContacts")
            .HasOptionalBinding<ContactAddress>(c => c.Addresses.FirstOrDefault(a => a.IsPreferred), "PreferredAddress");