在WHERE子句中具有多个条件的LINQ查询

时间:2016-12-07 05:51:41

标签: c# mysql linq

我已进入第一个开发角色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的所有客户端。但是,它不会返回任何客户端。

有人可以告诉我我的疑问有什么问题吗?

2 个答案:

答案 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表是指个别行不能Feature8 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;