首页 新闻 会员 周边 捐助

Lambda表达式或者linq实现查询条件满足多个对象集合的数据

0
悬赏园豆:5 [待解决问题]

以下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 (
已知的一个对象集合
);

姚小丹的主页 姚小丹 | 初学一级 | 园豆:39
提问于:2024-07-26 12:39
< >
分享
所有回答(4)
0

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

echo_lovely | 园豆:1534 (小虾三级) | 2024-07-26 15:37
0

好家伙,gpt

程序员Jackzhang | 园豆:202 (菜鸟二级) | 2024-07-26 15:49
0

以下是将给定的 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_dtlsale_so 替换为您实际使用的数据源,并根据需要进行进一步的调整。这些代码示例可以帮助您将 SQL 查询转换为等效的 Lambda 表达式或 LINQ 查询。

Technologyforgood | 园豆:7535 (大侠五级) | 2024-07-26 20:41
0
楠木大叔 | 园豆:2083 (老鸟四级) | 2024-07-30 22:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册