想要一个Query在Linq查询中按变量排序

时间:2010-06-20 07:04:44

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

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

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

3 个答案:

答案 0 :(得分:6)

假设您想通过SQL进行排序,那么您需要传递排序列/类型。查询将被推迟,直到您实际执行select,这样您就可以逐步构建查询,一旦完成,就执行它:

// 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应用于结果库。

答案 1 :(得分:3)

    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);

答案 2 :(得分:0)

您可以在不同的步骤中“构建”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.

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