我当前的数据库解决方案包括名为 Establishment
、Feature
的三个表和一个名为 EstablishmentFeature
的多对多链接表(因为机构可以有很多特征,一个特征可以存在于多个机构中)。
我需要生成一个查询,该查询返回仅满足特定条件的机构,即哪些机构具有基于传入的 featureId 集合的 X 个特征。该机构必须具有正在搜索的所有特征,即.. AND
不是 OR
条件。
我得到了 SQL 来实现预期的结果,但我正在竭尽全力尝试计算出 LINQ(最好是 lambra)等价物。 T-SQL 是:
SELECT e.[EstablishmentId], e.[Name], e.[Description]
FROM Establishment e
INNER JOIN EstablishmentFeature ef
ON e.[EstablishmentId] = ef.[EstablishmentId]
WHERE ef.[FeatureId] in ('20', '15', '72')
GROUP BY e.[EstablishmentId], e.[Name], e.[Description]
HAVING COUNT(*) = 3
我尝试使用 Linqer 来转换 SQL,但 Linqer 在尝试转换时崩溃了。我尝试重新安装 Linqer,但在尝试编译 LINQ 语法时它确实崩溃了。 (虽然更简单的转换有效)。还尝试使用 LinqPad 计算出 LINQ 等价物,但我最终只是追着尾部...
这是我必须使用的东西吗 PredicateBuilder为了?有些疲惫,如果有一个简单的解决方案让我逃避,我不想经历 PredicateBuilder 学习曲线。
最佳答案
我会尝试这个(对于所有给定的id,有任何(=至少一个)具有这个给定id的特征):
var establishments = context.Establishments
.Where(e => featureIds.All(fid => e.Features.Any(f => f.FeatureId == fid)))
.ToList();
(featureIds
是一个 IEnumerable<int>
,其中包含正在搜索的 ID。)
关于c# - 如何使用 LINQ 和 Entity Framework 查询具有 'AND' 条件的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18747727/