OrderBy与另一个表的值

时间:2015-12-30 01:51:16

标签: c# asp.net linq

我想订购基于产品的Listview,并显示它的名称。我的网站由多种语言组成,因此我构建了一个链接表,其中包含每种语言的产品名称。

当我尝试对其进行排序时,我总是会收到此错误

  

DbSortClause表达式必须具有可比较的类型。   参数名称:key

我的代码如下:

IQueryable<Product> query = from p in _dbCtx.Products
                            where p.LanguageProduct.Any(lg => lg.Language == _currentCulture)
                            select p;

...

if (keys.Contains("OrderBy"))
{
    if (Request.QueryString["OrderBy"] == "NameAsc")
    query = query.OrderBy(t => t.LanguageProduct.Select(v => v.ProductName));  
}

有什么建议吗?非常感谢提前。

编辑:也许我还不够清楚。因此,我将添加更多代码:

IQueryable<Product> query = from p in _dbCtx.Products
                                    where p.IsVisible == true
                                    where p.LanguageProduct.Any(lg => lg.Language == _currentCulture)
                                    select p;
        if (keys.Contains("Indiv"))
        {
            if (Request.QueryString["Indiv"] == "IndivYes")
                query = query.Where(c => c.IsCustomizable == true);
            if (Request.QueryString["Indiv"] == "IndivNo")
                query = query.Where(c => c.IsCustomizable == false);
        }
        if (keys.Contains("OrderBy"))
        {
            if (Request.QueryString["OrderBy"] == "NameAsc")
                query = query.OrderBy(t => t.LanguageProduct.Select(v => v.ProductName));
            else if (Request.QueryString["OrderBy"] == "NameDes")
                query = query.OrderByDescending(t => t.LanguageProduct.Select(v => v.ProductName));
            else if (Request.QueryString["OrderBy"] == "PriceAsc")
                query = query.OrderBy(t => t.ListPrice);
            else if (Request.QueryString["OrderBy"] == "PriceDes")
                query = query.OrderByDescending(t => t.ListPrice);
        }

通过在查询中添加连续的where子句直到必须按名称排序,一切正常。以下是我的数据库的结构:

table:      Product                         ProductTranslation

columns:    id     ReferenceName            FKId   Language     ProductName  
Example:    1      FirstProduct             1       fr-FR       Produit 1
                                            1       de-DE       Produkt 1
                                            1       en-US       Product 1

1 个答案:

答案 0 :(得分:1)

你可以这样做:

var queryable = query.SelectMany(p => p.LanguageProduct, (p, l) => new{p,l})
        .OrderBy(t => t.l.ProductName)
        .Select(t => t.p);