Linq查询故障排查:分类数据筛选逻辑异常求助
解决LINQ查询返回空的问题
嘿,我来帮你搞定这个LINQ查询的问题!先理清楚你的情况:
背景和需求
- 原查询能正常返回数据库里全部15条分类数据:
var ROEBCategories = (from c in db.Content_Category select c).OrderBy(x => x.CategoryId).AsParallel().ToList();
- 你的核心需求是:返回有序的分类列表,规则是:如果存在匹配指定
CompanyId的CategoryId=15分类,就只返回这一条;如果这条不存在,就返回剩下的14条分类。 - 你自己尝试写的查询却返回了0条数据,代码是:
var roebCategories = (from c in db.Content_Category where c.CompanyId == rawData.CompanyId || (!(from c2 in db.Content_Category select c2.CategoryId).Contains(c.CategoryId) && (!c.CompanyId.HasValue)) select c).OrderBy(x => x.CategoryId).AsParallel().ToList();
问题出在哪?
你写的查询里有个逻辑漏洞:(!(from c2 in db.Content_Category select c2.CategoryId).Contains(c.CategoryId))这个条件永远是false!因为c本身就是来自db.Content_Category的实体,它的CategoryId肯定在这个集合里,所以这部分条件不成立。剩下的就只有c.CompanyId == rawData.CompanyId,如果数据库里没有匹配这条条件的数据,自然就返回空列表了。
修复后的方案
这里给你两种实现方式,都能满足你的需求:
方式一:分步查询(更易读)
先单独查找目标分类,再根据结果决定返回什么:
// 先找匹配CompanyId的15号分类 var targetCategory = db.Content_Category .FirstOrDefault(c => c.CategoryId == 15 && c.CompanyId == rawData.CompanyId); // 根据是否找到目标分类,返回对应结果 var roebCategories = targetCategory != null ? new List<Content_Category> { targetCategory }.OrderBy(x => x.CategoryId).ToList() : db.Content_Category.Where(c => c.CategoryId != 15) .OrderBy(x => x.CategoryId) .AsParallel() .ToList();
方式二:单条LINQ查询
如果想用一条语句实现,可以这样写:
var roebCategories = db.Content_Category .Where(c => // 要么是匹配CompanyId的15号分类 (c.CategoryId == 15 && c.CompanyId == rawData.CompanyId) // 要么是其他分类,且不存在匹配CompanyId的15号分类 || (c.CategoryId != 15 && !db.Content_Category.Any(x => x.CategoryId == 15 && x.CompanyId == rawData.CompanyId)) ) .OrderBy(x => x.CategoryId) .AsParallel() .ToList();
这样就能完美实现你的需求:当存在匹配指定CompanyId的15号分类时,只返回它;否则返回剩下的14条分类。
内容的提问来源于stack exchange,提问作者JsonDork
相关产品推荐
相关产品推荐

