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
相关产品推荐
相关产品推荐

