【问题标题】:want a Query to make order by variable in Linq query想要一个查询在 Linq 查询中按变量排序
【发布时间】:2010-06-20 07:04:43
【问题描述】:

如何按列变量排序,因为我在页面上有一个下拉菜单,我想根据在此下拉菜单中选择的排序顺序显示网格,例如价格、代码、评级、描述等,我不想单独写查询每一列。

from lm in lDc.tbl_Products
where lm.TypeRef == pTypeId
 orderby lm.Code ascending
 select new; 

【问题讨论】:

标签: linq linq-to-sql linq-to-entities


【解决方案1】:

假设您想通过 SQL 进行排序,那么您需要传入排序列/类型。查询会延迟到您实际执行选择,这样您就可以逐步构建查询,完成后执行它,如下所示:

// Do you query first.  This will NOT execute in SQL yet.
var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId);

// Now add on the sort that you require... you could do ascending, descending,
// different cols etc..
switch (sortColumn)
{
    case "Price":
        query = query.OrderBy(q => q.Price);
        break;
    case "Code":
        query = query.OrderBy(q => q.Code);
        break;
    // etc...
}

// Now execute the query to get a result
var result = query.ToList();

如果您想在 SQL 之外执行此操作,则只需获取不排序的基本结果,然后根据您需要的排序标准将 OrderBy 应用于结果。

【讨论】:

  • 如果我在查询中也有一些连接呢??
  • @Azhar 只需在Where 之后添加Join,其他一切都应该一样。 Join 将加入另一个 IQueryable
【解决方案2】:
    public static IEnumerable<T> OrderByIf<T,TKey>(this IEnumerable<T> source, bool condition, Func<T, TKey> keySelector)
    {
        return (condition) ? source.OrderBy(keySelector).AsEnumerable() : source;
    }

用法:

            var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId)
                                    .OrderByIf(sortColumn == "Price", p => p.Price)
                                    .OrderByIf(sortColumn == "Code", p => p.Code);

【讨论】:

    【解决方案3】:

    您可以在单独的步骤中“构建”一个 LINQ 查询。

    生成基本查询以返回未排序的信息。在您尝试枚举结果之前,不会执行此查询。

    var data = from lm in lDc.tbl_Products
               where lm.TypeRef == pTypeId
               select new;
    

    然后在您的事件处理程序中,在将结果绑定到网格之前应用您希望的任何排序。

    var orderedData = from lm in data
                      order lm.Code ascending
                      select new;
    
    // TODO: Display orderedData in a grid.
    

    您枚举的完整查询将被评估。这意味着您可以为下拉列表中的每个项目运行单独的查询,该查询是从“基本”查询构建的。

    【讨论】:

    • 是的,但在这我必须写多个 if 语句?我可以从 if 语句中声明orderedData吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多