c# - 如何使用 LINQ 和 Entity Framework 查询具有 'AND' 条件的多对多关系

标签 c# sql-server linq entity-framework linq-to-entities

我当前的数据库解决方案包括名为 EstablishmentFeature 的三个表和一个名为 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/

相关文章:

c# - 使用 KeyValuePair 对列表进行排序

c# - 在 EntityFramework 中克隆具有多对多关系的对象

c# - 如何从数组中获取所有可能的组合?

c# - 隐藏静态方法可以吗?

c# - 在什么情况下您会使用 new 关键字初始化值类型?

sql-server - SQL Server : OPENQUERY in easy words (with example)

asp.net - 页面查看计数器 - 数据库设置和技术/策略

c# - 如何在 View 查询中找到表别名?

c# - 使用 ForEach lambda 修改列表中的元素

c# - 从linq中的第n条记录中选择n条记录