C# 在一对多关系和复合键上使用EF的OrderBy
使用EF构建,我拥有一流的产品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
[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;
}