C# 在一对多关系和复合键上使用EF的OrderBy

C# 在一对多关系和复合键上使用EF的OrderBy,c#,asp.net,entity-framework,iqueryable,composite-key,C#,Asp.net,Entity Framework,Iqueryable,Composite Key,使用EF构建,我拥有一流的产品 [Table("Products")] public class Product { public Product() { this.LanguageProduct = new List<LanguageProduct>(); } [Key, ScaffoldColumn(false)] public int ProductId { get; set; } public virtual I

使用EF构建,我拥有一流的产品

[Table("Products")]
public class Product
{
    public Product()
    {
        this.LanguageProduct = new List<LanguageProduct>();
    }
    [Key, ScaffoldColumn(false)]
    public int ProductId { get; set; }
    public virtual ICollection<LanguageProduct> LanguageProduct { get; set; }
}
如果您没有注意到类LanguageProduct有一个基于两个外键的复合键。直到现在一切都很好。 在我的一个aspx页面中,我尝试用一种语言通过产品名称填充dropdownlist订单

public IQueryable GetProductsList()
    {
        var _db = new ApplicationDbContext();
        IQueryable query = _db.Products.OrderBy(p => p.LanguageProduct.Where(z => z.Language == "en-US").SelectMany(x => x.ProductName));
        return query;
    }
正如您可能怀疑的那样,我的问题来自于没有返回任何内容的查询。我什么都试过,但没有成功。除此之外,我还将multipleActiveResultSet添加到了我不喜欢的连接字符串中。
您是否有任何迹象可以解决此问题?

应该是
\u db.Products.OrderBy(p=>p.LanguageProduct.SingleOrDefault(z=>z.Language==“en US”).ProductName))
,为了安全地检查空值,您可以使用
Where
而不是
SelectMany
,您需要附加
Select(x=>Select(x.ProductName).SingleOrDefault()
结尾。此方法使用默认比较器,不按产品名称排序。您几乎做到了@KingKing。您的回答帮助我找到了正确的答案:IQueryable query=\u db.Products.OrderBy(p=>p.LanguageProduct.FirstOrDefault(z=>z.Language==“en-US”).ProductName)
FirstOrDefault
SingleOrDefault
在这种情况下都可以(假设数据库中没有重复的语言)。SingleOrDefault返回此错误:方法“Single”和“SingleOrDefault”只能用作最终查询操作。请考虑在这个实例中使用方法“FrestRealDebug”。
public IQueryable GetProductsList()
    {
        var _db = new ApplicationDbContext();
        IQueryable query = _db.Products.OrderBy(p => p.LanguageProduct.Where(z => z.Language == "en-US").SelectMany(x => x.ProductName));
        return query;
    }