如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式

Posted

技术标签:

【中文标题】如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式【英文标题】:How to convert from PostgreSQL query to LINQ or lambda expression 【发布时间】:2021-10-27 09:55:20 【问题描述】:

我有一个 PostgreSQL 查询,我需要将其转换为 Lamba exp 或 LINQ 以在我的 ASP.NET Core C# 项目中使用。此外,表的名称是“DeliveryFinances”。

这是我的 PostgreSQL 查询

SELECT t1."DriverId", t2."OrderNo", COUNT(*)
FROM public."DeliveryFinances" t1
JOIN
(
    SELECT MIN("OrderNo") AS "OrderNo", "DriverId"
    FROM public."DeliveryFinances"
    GROUP BY "DriverId"
) t2 ON t1."DriverId" = t2."DriverId"
GROUP BY t1."DriverId", t2."OrderNo"
LIMIT 25

这是我在 pgAdmin 中运行查询后得到的结果

| DriverId| OrderNo | count |
|----------------------------
| 123123  | REQWFA  |      3|
| 345534  | ASDCA3  |      2|
| 565534  | MCJSL1  |      1|

有什么方法可以在 lambda 或 LINQ 中做到这一点?请帮帮我。

【问题讨论】:

到目前为止您尝试过什么?无论如何similar question with answer 鉴于此查询可能更有效地使用行编号和窗口函数完成,而 LINQ 通常不支持这些,我不认为您应该将其转换为 LINQ。 也许我的SQL to LINQ Recipe 可以帮助你。 您使用的是什么 LINQ:LINQ to Objects / SQL / EF 6.x / EF Core 2.0 / 2.1 / 3.x / 5.x / 6.x?您的实体或数据库类是什么? 【参考方案1】:

使用 EF Core 5,直接翻译似乎可行:

var qmin = from t2 in DeliveryFinances
           group t2.OrderNo by t2.DriverId into dg
           select new  OrderNo = dg.Min(), DriverId = dg.Key ;

var q = from t1 in DeliveryFinances
        join t2 in qmin on t1.DriverId equals t2.DriverId
        group new  t1, t2  by new  t1.DriverId, t2.OrderNo  into t1t2g
        select new 
            t1t2g.Key.DriverId,
            t1t2g.Key.OrderNo,
            Count = t1t2g.Count()
        ;
var ans = q.Take(25);

它在我的数据库上似乎不是特别有效,但几乎可以直接转换为您的 SQL。

更好地查看您的数据可能会提供一种在查询中使用 Group Join 的方法,但它可能无法转换为 SQL。

【讨论】:

以上是关于如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何将 linq 查询转换为 SQL 查询?

如何将sql查询转换为linq查询

如何将此 SQL 内部联接查询转换为 LINQ 语法?

如何将SQL查询转换为LINQ?

如何将此 GROUP BY / MIN SQL 查询转换为 LINQ?

如何以编程方式将 LINQ 查询转换为正确描述 linq 表达式的可读英文文本?