【问题标题】:Looking for a Linq query寻找 Linq 查询
【发布时间】:2021-07-02 15:09:05
【问题描述】:

我正在搜索一个 LINQ-Query,它构建一个绑定到 DataGrid 的表。根据我稍后解释的情况,它应该排除/省略行。 现在我有了三个 SQL Server 表,“tblOrder”、“tblOrderState”和“tblListOrderState”。

“tblOrder”中的列:

  • 身份证
  • 订单号

“tblOrderState”中的列:

  • 身份证
  • StateID(tblListOrderState.Id 的外键)
  • OrderID(tblOrder.ID 的外键)
  • DateMain(此行的日期时间)

“tblListOrderState”中的列

  • 身份证
  • 州名

最终查询的表应该有这些列:

  • 订单号
  • 州名
  • 日期主要
  • 也许还有 StateID

现在以“tblOrder”中的这三个记录为例:

  1. 记录 1:
  • ID = 59
  • 订单号 = 21-1111
  1. 记录 2:
  • ID = 60
  • 订单号 = 21-2222
  1. 记录 3:
  • ID = 61
  • 订单号 = 21-3333

以及“tblOrderState”中的这五条记录:

  1. 记录 1:
  • ID = 117
  • StateID = 5
  • 订单 ID = 59
  • DateMain = 2021-02-02 (yyyy-mm-dd)
  1. 记录 2:
  • ID = 118
  • StateID = 5
  • 订单 ID = 60
  • DateMain = 2021-01-12
  1. 记录 3:
  • ID = 119
  • StateID = 5
  • 订单 ID = 61
  • DateMain = 2021-02-02
  1. 记录 4:
  • ID = 120
  • StateID = 6
  • 订单 ID = 61
  • DateMain = 2021-03-30
  1. 记录 5:
  • ID = 121
  • StateID = 5
  • 订单 ID = 61
  • DateMain = 2021-01-06

而这两条记录在“tblListOrderState”中:

  1. 记录 1:
  • ID = 5
  • StateName = "等待处理"
  1. 记录 2:
  • ID = 6
  • StateName = "进程完成"

我写了这个查询:

var FQuery = from KTL in ctxt.tblOrders
    join TBR in ctxt.tblOrderStates on KTL.ID equals TBR.OrderID into KGB
    from TAS in KGB.DefaultIfEmpty()
    join KRA in ctxt.tblListOrderStates on TAS.StateID equals KRA.Id
    where TAS.StateID.Equals(5) || TAS.StateID.Equals(6)
    orderby TAS.DateMain descending
    select new { KTL.OrderNumber, KRA.StateName, TAS.DateMain, TAS.StateID };

基于此,它给了我这个结果:

OrderNumber        StateName            DateMain       StateID
21-3333            process finished     2021-03-30     6
21-3333            waiting to process   2021-02-02     5
21-1111            waiting to process   2021-02-02     5
21-2222            waiting to process   2021-01-12     5
21-3333            waiting to process   2021-01-06     5

我的愿望只是有一个查询,当它存在具有最新 DateMain 值的 tblOrderState-Record 时,它会忽略处于“进程完成”状态的记录。但重要的是:如果有一条记录“处理完成”和一条记录“等待处理”具有更多最近的 DateMain-value,那么它应该显示在结果表中。可以说,该表应该只包含等待处理的条目,因此在上面的示例中,OrderNumber 为“21-3333”的条目根本不会出现。

更新: 这是 DotNETfiddle.net 上的示例: https://dotnetfiddle.net/clx9iG

如果无法通过查询来执行此操作,也许一个好的解决方法是编写一个函数,该函数随后使用 myList.Remove(...) 删除行。

【问题讨论】:

  • 请不要将图像用于代码、数据或错误。使用格式化文本。
  • @Dale 我不得不重写几次,因为 stackoverflow 说“您的帖子似乎包含未正确格式化为代码的代码”,但现在它变成了文本。

标签: sql-server entity-framework linq


【解决方案1】:

现在找到了解决办法:

var FQuery = from KTL in ctxt.tblOrders
    join TBR in ctxt.tblOrderStates on KTL.ID equals TBR.OrderID into KGB
    from TAS in KGB.DefaultIfEmpty()
    join KRA in ctxt.tblListOrderStates on TAS.StateID equals KRA.Id
    where TAS.StateID.Equals(5) && !TAS.OrderID.Equals(KGB.Where(tz => tz.StateID.Equals(6)).FirstOrDefault() == null ? -2 : KGB.Where(tz => tz.StateID.Equals(6)).FirstOrDefault().OrderID)
    orderby TAS.DateMain descending
    select new { KTL.OrderNumber, KRA.StateName, TAS.DateMain, TAS.StateID };

它没有涵盖按时间顺序在 6 之后仍然可以出现 5 的情况,但这已经足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多