LINQ可以按列索引排序吗?
我正在努力寻找LINQ orderby示例,其中数据是按列索引排序的。这可能吗LINQ可以按列索引排序吗?,linq,c#-3.0,c#-4.0,sql-order-by,Linq,C# 3.0,C# 4.0,Sql Order By,我正在努力寻找LINQ orderby示例,其中数据是按列索引排序的。这可能吗 谢谢我想你是说用索引器选择?如果是这样,下面是我的一个Linq查询的示例: var tmp = from container in Container where container.ContainerTypeID == 2 select new { ContainerID = container.ContainerID, TypeID = container.ContainerTypeID
谢谢我想你是说用索引器选择?如果是这样,下面是我的一个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 });
我知道不可能更改索引。在LinqToSql中,您有一个映射到数据库的类,其属性名称不会更改。这些属性使用属性映射到数据库。数据库列名位于属性中 如果要在设计时更改列名,可以在类是自动生成的情况下使用设计器,也可以自己更改属性
如果要在运行时更改列名,则应提供。这将覆盖属性的映射。LINQ中没有列这样的概念,只有字段和属性。您的意思可能是在您创建的匿名类型中指定属性的索引:
from p in persons
orderby 1
select new { p.FirstNam, p.LastName }
这是不可能的,因为a不能按匿名类型中的投影属性输出值排序,b不能按索引排序。要解决问题,可以使用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,而不是基于IEnumerable的LINQ to对象,则可以解析表达式树,根据某些索引查找表达式,并添加相应的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规范中关于查询表达式转换的章节,如果您想在合理的时间内完成这项工作,您应该有一些反射和表达式方面的经验
如果您需要的话,我可以提供一些示例代码。我今天早些时候不得不这么做,但是使用了多个列—甚至更难。LINQ绝对不适合我,尤其是在传递了大量动态索引的情况下 您可能会更幸运地将对象拉入列表,然后对其使用.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
});
它返回对象,为什么需要按列索引排序?您所说的“列索引”是什么意思?你能举个例子吗?我有4列,这些列的名称将来可能会改变。例如,Id、FName、LName、TelNo我有一个表,用于存储客户端列表。我想按第一列Id、第二列FName等排序。我不想按名称引用,因为名称并不总是相同的。如果更改数据库,最好也更改代码:如果我错了,请更正我,但在MS SQL中,我们可以按列索引排序,对吗?如果是这样的话,我会认为您也可以在LINQ中这样做。LinqToSql是一种抽象。因此,数据世界中有一些无法触及的特性,因为它们在对象世界中没有意义。对象世界中没有列,所以按列的索引排序没有意义。这是一个很好的解释,我想首先需要阅读一下表达式树。除此之外,我很清楚下一步该做什么。谢谢这一切都很好,但是它没有解决数据库中将FirstName重命名为FName的情况。事实上,如果您想知道如何处理对DB模式的更改,您必须询问如何处理对DB模式的更改。但这不是一个关键问题。vikp甚至没有特别询问LinqtoSQL,所以很难解决这个问题。我最好的建议是:如果可以,从代码中创建DB模式,而不是相反。手动代码更改将反映在整个代码库中,新生成的代码将破坏它。如果不能,请考虑手动更改DB模式和实体类。远离需要使用不适当工具的ORM。