我很难找到LINQ orderby示例,其中数据按列索引排序。这可能吗?
谢谢
答案 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
});