gpt4 book ai didi

c# - LINQ OrderBy 基于行值

转载 作者:太空狗 更新时间:2023-10-30 01:00:33 25 4
gpt4 key购买 nike

假设我们有两个表,父表“DocumentCodes”和子表“Documents”。DocumentCodes 表有 DID、DocumentName、PrintOrder 和 AscOrDesc 列 文档表包含 ID、DID 和 EffectiveDate 列。我们通过连接这两个表来获取数据表。

我们需要根据以下规则对该数据表进行排序。

  1. 按“PrintOrder”列升序排序。
  2. 如果两行或更多行具有相似的“DocumentNames”值,则根据“AscOrDesc”值按“EffectiveDate”升序或降序排序。“AscOrDesc”列仅接受“A”或“D”。如果值为“A”,我们需要对“EffectiveDate”进行升序排序,如果值为“D”,我们需要对“EffectiveDate”进行降序排序。

例如,

文档代码

 DID     DocumentName       PrintOrder      AscOrDesc
1 Test1 1 D
2 Test2 2 A
3 Test3 3 D

文档

ID        DID        EffectiveDate    
1 2 7/9/2017
2 1 5/5/2017
3 2 7/8/2017
4 3 4/9/2017

连接以上两个表后。我们有数据表。

ID      DocumentName EffectiveDate  PrintOrder  AscOrDesc
1 Test2 7/9/2017 2 A
2 Test1 5/5/2017 1 D
3 Test2 7/8/2017 2 A
4 Test3 4/9/2017 3 D

现在在使用上述规则对该 DataTable 进行排序之后。 DataTable 应该是这样的。

ID      DocumentName EffectiveDate  PrintOrder  AscOrDesc
1 Test1 5/5/2017 1 D
2 Test2 7/8/2017 2 A
3 Test2 7/9/2017 2 A
4 Test3 4/9/2017 3 D

注意:EffectiveDate 的格式为 MM/DD/YYYY。

我尝试使用以下代码,但它不起作用。

var records2 = from q in datatable.AsEnumerable()
let sortorder= q.Field<string>("AscOrDesc") == "A" ?
"q.Field<DateTime>(\"EffectiveDate\") ascending":
"q.Field<DateTime>(\"EffectiveDate\") descending"
orderby q.Field<int>("PrintOrder"),sortorder
select q;

我在上面的代码中做错了什么?

最佳答案

情况相当糟糕,因为理论上可以比较具有相同 PrintOrder 但不同 AscOrDesc 值的两个结果行。只是数据源阻止了这种情况。

我确实有一个可怕的 hack,我认为应该有用,但我真的不为此感到自豪。基本上,假设日期是一个数字......按降序日期排序等同于按“日期编号”的否定排序。对于 DateTime,我们可以只取 Ticks 值,导致:

var records2 = from q in datatable.AsEnumerable()
let ticks = q.Field<DateTime>("EffectiveDate").Ticks *
(q.Field<string>("AscOrDesc") == "A" ? 1 : -1)
orderby q.Field<int>("PrintOrder"), ticks
select q;

虽然丑陋,但它应该可以工作......

关于c# - LINQ OrderBy 基于行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com