以下sql语句的语法如何转化成一个 Lambda表达式 或者linq实现
场景:订单根据查询条件查询 然后根据客户、商品、单价、折扣进行了分组 求出了客户、单价、折扣、商品、总金额
然后还要求出这一批客户、单价、商品、、折扣对应的是哪些单据
SELECT
sale_so.id AS billId
FROM
sale_so_dtl
JOIN sale_so ON sale_so_dtl.so_id = sale_so.id
WHERE
( sale_so.customer_id, sale_so_dtl.sku_id, sale_so_dtl.price, sale_so_dtl.discount ) IN (
SELECT
s.customer_id,
d.sku_id,
d.price,
d.discount
FROM
sale_so_dtl d
JOIN sale_so s ON d.so_id = s.id
WHERE
s.created_time >= '2024-07-25'
AND d.sku_id IN ( 203130, 201916, 207667, 207668 )
GROUP BY
s.customer_id,
d.sku_id,
d.price,
d.discount
);
或者:
SELECT
sale_so.id AS billId
FROM
sale_so_dtl
JOIN sale_so ON sale_so_dtl.so_id = sale_so.id
WHERE
( sale_so.customer_id, sale_so_dtl.sku_id, sale_so_dtl.price, sale_so_dtl.discount ) IN (
已知的一个对象集合
);
ChatGPT :
public class SaleSo
{
public int Id { get; set; }
public int CustomerId { get; set; }
public DateTime CreatedTime { get; set; }
}
public class SaleSoDtl
{
public int SoId { get; set; }
public int SkuId { get; set; }
public decimal Price { get; set; }
public decimal Discount { get; set; }
}
var validDetails = from s in saleSoList
join d in saleSoDtlList on s.Id equals d.SoId
where s.CreatedTime >= new DateTime(2024, 7, 25) &&
new List<int> { 203130, 201916, 207667, 207668 }.Contains(d.SkuId)
group new { s.CustomerId, d.SkuId, d.Price, d.Discount } by new { s.CustomerId, d.SkuId, d.Price, d.Discount } into g
select new
{
g.Key.CustomerId,
g.Key.SkuId,
g.Key.Price,
g.Key.Discount
};
var billIds = from d in saleSoDtlList
join s in saleSoList on d.SoId equals s.Id
where validDetails.Contains(new { s.CustomerId, d.SkuId, d.Price, d.Discount })
select s.Id;
var result = billIds.Distinct().ToList();
在这个代码中:
saleSoList 是 SaleSo 对象的集合。
saleSoDtlList 是 SaleSoDtl 对象的集合。
第一个查询 validDetails 从两个表中选择并分组客户ID、SKU ID、价格和折扣。
第二个查询 billIds 使用第一个查询的结果来选择对应的单据ID,并确保这些单据ID是唯一的。
这段代码使用了 LINQ 的 join、where、group 和 select 子句来实现类似于 SQL 查询的功能。
我一般都是一条一条查,然后数据执行 linq
好家伙,gpt
以下是将给定的 SQL 查询转换为 Lambda 表达式和 LINQ 实现的示例代码:
Lambda 表达式实现:
csharp
Copy to clipboard
var query = sale_so_dtl
.Join(sale_so, dtl => dtl.so_id, so => so.id, (dtl, so) => new { dtl, so })
.Where(x => x.so.created_time >= new DateTime(2024, 07, 25) &&
new[] { 203130, 201916, 207667, 207668 }.Contains(x.dtl.sku_id))
.GroupBy(x => new { x.so.customer_id, x.dtl.sku_id, x.dtl.price, x.dtl.discount })
.Select(g => new { g.Key.customer_id, g.Key.sku_id, g.Key.price, g.Key.discount })
.ToList();
var result = sale_so_dtl
.Join(sale_so, dtl => dtl.so_id, so => so.id, (dtl, so) => new { dtl, so })
.Where(x => query.Any(q =>
q.customer_id == x.so.customer_id &&
q.sku_id == x.dtl.sku_id &&
q.price == x.dtl.price &&
q.discount == x.dtl.discount))
.Select(x => new { x.so.id as billId })
.ToList();
LINQ 实现:
csharp
Copy to clipboard
var query = (from dtl in sale_so_dtl
join so in sale_so on dtl.so_id equals so.id
where so.created_time >= new DateTime(2024, 07, 25) &&
new[] { 203130, 201916, 207667, 207668 }.Contains(dtl.sku_id)
group new { dtl, so } by new { so.customer_id, dtl.sku_id, dtl.price, dtl.discount } into g
select new { g.Key.customer_id, g.Key.sku_id, g.Key.price, g.Key.discount })
.ToList();
var result = (from dtl in sale_so_dtl
join so in sale_so on dtl.so_id equals so.id
where query.Any(q =>
q.customer_id == so.customer_id &&
q.sku_id == dtl.sku_id &&
q.price == dtl.price &&
q.discount == dtl.discount)
select new { billId = so.id })
.ToList();
请注意,您需要将 sale_so_dtl
和 sale_so
替换为您实际使用的数据源,并根据需要进行进一步的调整。这些代码示例可以帮助您将 SQL 查询转换为等效的 Lambda 表达式或 LINQ 查询。