gpt4 book ai didi

sql-server - 如何通过复合键检索多个实体?

转载 作者:行者123 更新时间:2023-12-03 23:43:10 24 4
gpt4 key购买 nike

我正在使用 Entity Framework (4.2,如果这很重要),我有一个模型,它有一个复合主键(两个 int 列)。我有一个整数对列表,它们表示我想从数据库中提取的对象列表。有没有一种简单的方法可以使用单个查询来提取所有这些对象?

我试过用我的列表加入查询,如下所示:

List<Tuple<int, int>> ids = GetIds();

var data =
from e in ctx.CompositeEntities
join i in ids on new {e.KeyA, e.KeyB} equals new {KeyA = i.Item1, KeyB = i.Item2}
select e;

但是,这总是会导致异常“无法创建类型为 'System.Tuple`2' 的常量值。此上下文中仅支持原始类型('例如 Int32、String 和 Guid')。”

最佳答案

我想看到一种更干净的方法来做到这一点,但是......至少它应该有效。

解决方案1 ​​

您需要什么:连接您的元组列表,然后使用 SqlFunctions.StringConvert 从您的实体连接“int 键” .由于它只需要 double 或 decimal 作为参数,因此您必须首先将 int 转换为 double 。

List<Tuple<int, int>> ids = GetIds();

var concatenatedIds = ids.Select(m => m.Item1 + "," + m.Item2).ToList();

var result = ctx.CompositeEntities
.Where(conatenatedIds.Contains(
SqlFunctions.StringConvert((double)m.KeyA) +
"," +
SqlFunctions.StringConvert((double)m.KeyB)));

解决方案2

使用 PredicateBuilder
List<Tuple<int, int>> ids = GetIds();

var predicate = Predicate.False<CompositeEntity>();
foreach (var tuple in ids)
predicate = predicate.Or(m => m.KeyA == tuple.Item1 && m.KeyB == tuple.Item2);

var result = ctx.CompositeEntities.Where(predicate);

解决方案3

先枚举,再做比较。
当然,这将从数据库中获取所有 CompositeEntities。

关于sql-server - 如何通过复合键检索多个实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com