在使用 Entity Framework 和复合主键时,实现与简单 Contains() 查询相同的功能变得更加复杂。本文探讨解决此问题的各种方法:
尝试使用表示复合主键值的元组进行直接连接或 Contains 操作在 Entity Framework 中会失败。这是因为无法将此类操作转换为 SQL,因为在此上下文中元组不被视为原始值。
另一种方法是使用 AsEnumerable() 将数据库表数据提取到内存中,并使用 LINQ to Objects 执行必要的筛选。但是,对于大型表,此解决方案效率极低。
对每个复合主键组件使用单独的 Contains() 语句会导致筛选不正确。这种方法会产生误导性结果,因为只包含一个匹配组件的实体会被错误地包含在内。
可以使用包含从复合主键组件派生的计算值的修改后的 Contains() 查询(例如,entity.Id1 * entity.Id2)。但是,此解决方案是非可搜索的,导致性能低下。
最可扩展的方法是结合 Contains 和内存连接。此方法使用初步的 Contains() 查询来缩小结果集,然后通过内存连接进行更精确的细化。
像 Linqkit 这样的谓词构建器允许创建包含每个复合主键值组合的 OR 子句的查询。虽然此方法可能适用于小型列表,但对于大型列表,其性能会下降。
另一种方法是使用 UNION 将每个复合主键值组合的多个查询组合起来。此解决方案对于小型到中等大小的列表可能有效。
以上是如何在实体框架中使用复合密钥有效查询实体?的详细内容。更多信息请关注PHP中文网其他相关文章!