我已进入第一个开发角色6个月,并开始在我们的存储库层中使用更多LINQ来查询我们的数据库。我可以在我创建的两个查询中使用一些帮助。
IQueryable<long> clientsWithoutFeature = from cf in db.Features
where cf.Feature != 9 && cf.Feature == 8
select cf.Client;
IQueryable<long> clientsWithFeature = from cf in db.Features
where cf.Feature == 9 && cf.Feature == 8
select cf.Client;
每个客户端可以有多个功能,每个功能都是一个单独的记录/行。
第一个查询应该返回所有具有8的功能而不是9的功能的客户端。但是,无论客户端是否具有9的功能,它都将返回功能为8的所有客户端。 / p>
第二个查询应该返回功能为8且功能为9的所有客户端。但是,它不会返回任何客户端。
有人可以告诉我我的疑问有什么问题吗?
答案 0 :(得分:4)
你的sql正在执行,就像你写的一样。您需要稍微重新构建查询以表达您的实际意图。
我倾向于使用这样的子查询方法:
IQueryable<long> clientsWithoutFeature = from cf in db.Features
where cf.Feature == 8 && !db.Features.Any(x => x.id == cf.id && x.Feature == 9)
select cf.Client;
IQueryable<long> clientsWithFeature = from cf in db.Features
where cf.Feature == 8 && db.Features.Any(x => x.id == cf.id && x.Feature == 9)
select cf.Client;
我不确定您的主键列是什么。所以我猜对了就是这个问题
答案 1 :(得分:0)
这非常简单。 Features
表是指个别行不能Feature
值8
和 9
。
为了得到你想要的东西JOIN
:
IQueryable<long> clientsWithoutFeature = from cf1 in db.Features
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true }
equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 }
where cf1.Feature != 9
select cf1.Client;
IQueryable<long> clientsWithFeature = from cf1 in db.Features
join cf2 in db.Features on new { cf1.Client, IsTargetFeature = true }
equals new { cf2.Client, IsTargetFeature = cf2.Feature = 8 }
where cf1.Feature == 9
select cf1.Client;