Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ可以按列索引排序吗?_Linq_C# 3.0_C# 4.0_Sql Order By - Fatal编程技术网

LINQ可以按列索引排序吗?

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 orderby示例,其中数据是按列索引排序的。这可能吗


谢谢

我想你是说用索引器选择?如果是这样,下面是我的一个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。