You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# LINQ实现SQL IN子查询效果的方法(避免重复记录)

C# LINQ实现SQL IN子查询效果的方法(避免重复记录)

嗨,我完全懂你现在的困扰——用Join关联两张表后拿到了一堆重复的Quote记录,想要复刻SQL里IN子查询的干净结果对吧?别着急,有两种简单又靠谱的方法能解决这个问题,我给你一步步说:

方法一:先获取目标ID集合,再用Contains过滤(最贴近SQL IN的写法)

先从QuoteDetail里把所有符合ProductNum包含"Test"的QuoteID捞出来,先去重,再用这个集合过滤主表Quote,这样就和你写的SQL IN逻辑一模一样了:

// 第一步:拿到所有符合条件的QuoteID,先去重避免冗余判断
var targetQuoteIds = QuoteDetail
    .Where(detail => detail.ProductNum.Contains("Test"))
    .Select(detail => detail.QuoteID)
    .Distinct();

// 第二步:用ID集合过滤主表,拿到干净的Quote记录
var result = Quote
    .Where(quote => targetQuoteIds.Contains(quote.QuoteID))
    .Select(quote => new {
        quote.QuoteID,
        quote.QuoteName,
        quote.QuoteNumber,
        quote.QuoteStatus
    })
    .Take(10);

方法二:用Any直接做关联判断(更紧凑的写法)

如果不想单独存ID集合,也可以直接在Quote的Where条件里用Any来判断:当前Quote是否存在对应的QuoteDetail满足ProductNum的条件。这种写法更简洁,本质逻辑和IN子查询是一致的,而且不会产生重复记录:

var result = Quote
    .Where(quote => QuoteDetail.Any(detail => 
        detail.QuoteID == quote.QuoteID && detail.ProductNum.Contains("Test")))
    .Select(quote => new {
        quote.QuoteID,
        quote.QuoteName,
        quote.QuoteNumber,
        quote.QuoteStatus
    })
    .Take(10);

为啥你之前用Join会出重复?

你之前的Join写法之所以拿到重复记录,是因为一个Quote可能对应多条符合条件的QuoteDetail,Join会把每一对匹配的记录都返回,自然就会有重复的Quote数据。而上面两种方法都是基于主表的单条Quote记录,判断它是否满足“存在符合条件的关联Detail”这个逻辑,所以每条Quote只会被返回一次,完美解决重复问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:34:29