LINQ可以按列索引排序吗?

时间:2010-07-20 11:39:21

标签: linq c#-3.0 c#-4.0 sql-order-by

我很难找到LINQ orderby示例,其中数据按列索引排序。这可能吗?

谢谢

5 个答案:

答案 0 :(得分:4)

LINQ中没有列这样的概念,只有字段和属性。你的意思可能是在你创建的匿名类型中指定属性的索引:

from p in persons
orderby 1
select new { p.FirstNam, p.LastName }

这是不可能的,因为a)您不能通过投影属性(匿名类型中的输出值)进行排序,以及b)您无法按索引排序。要解决a),您可以使用“into”关键字:

from p in persons
orderby p.FirstName
select new { First = p.FirstName, Last = p.LastName }
into tmp
   orderby tmp.First
   select tmp;

如果你使用基于IQueryable的LINQ提供程序(比如LINQ to SQL,而不是LINQ to基于IEnumerable的对象),你可以解析表达式树,根据某个索引找到表达式,并添加相应的OrderBy方法调用。

var query = from p in persons 
            select new { Name = p.FirstName + " " + p.LastName, ...}
query = AddOrderByPosition (query, 1);
foreach (var p in query) {...}

AddOrderByPosition必须创建一个新的表达式树,它使用原始查询表达式作为源(子查询,基本上也是“into”创建的)并在末尾添加对OrderBy的调用(不需要选择)。您想首先阅读有关查询表达式转换的C#规范章节,如果您希望在合理的时间内完成此操作,您应该具备一些反射和表达式的经验。

如果您需要,我可以提供一些示例代码。

答案 1 :(得分:2)

我知道无法更改索引。

答案 2 :(得分:1)

我想你可能意味着选择一个索引器?如果是这样,以下是我的一个Linq查询中的示例:

var tmp = 
    from container in Container
    where container.ContainerTypeID == 2
    select new { ContainerID = container.ContainerID, TypeID = container.ContainerTypeID};

// The indexer cannot be used with the query expression format, so we need to convert to dot notation.
// We also need to convert tmp to an Enumerable so that .NET performs the query instead of SQL.
var results = tmp.AsEnumerable().Select((row, index) => new { row.ContainerID, row.TypeID, ContainerIndex = index });

答案 3 :(得分:1)

在LinqToSql中,您有一个映射到数据库的类,其属性名称不会更改。这些属性使用属性映射到数据库。数据库列名称位于属性中。

如果要在设计时更改列名,可以使用设计器(如果自动生成类)或自行更改属性。

如果要在运行时更改列名,则应提供XmlMappingSource。这将覆盖属性的映射。

答案 4 :(得分:0)

我今天早些时候必须这样做(但是使用多列 - 甚至更难)。 LINQ绝对不适合我,尤其是传递了大量动态索引。

您可以更好地将对象拉入List<T>,然后使用.Sort方法。这是一个可以指导你的肮脏例子。

var query = db.MyTable.Where(x => something);
var list = query.ToList();
list.Sort((x, y) => {
    // decide how you want to compare
    // use string.compare or another method
    // return -1, 0, 1 as is normal for sorting

    return 0; //Replace this
});