gpt4 book ai didi

entity-framework - 如何在 EF6 中使用组合键从表中搜索记录?

转载 作者:行者123 更新时间:2023-12-03 02:47:24 30 4
gpt4 key购买 nike

我使用 Entity Framework 的 Code First 创建了数据库架构,其中一个模型具有组合键(在数据库中完美反射(reflect))。

但是,当我尝试使用组合键列表查找记录时,我收到一个异常:“无法创建‘匿名类型’类型的常量值。在此上下文中仅支持原始类型或枚举类型。”

这是我最后使用的失败代码(它的变体也产生了相同的错误):

var ids = models.Select(m => new { m.Id, m.InstanceId })
.ToArray();

var records = _dataService.TableWithCompositeKey
.Where(t => ids.Contains(new { t.Id, t.InstanceId }))
.ToArray();

评估记录时抛出异常。那么我怎样才能完成这样的任务呢?

最佳答案

编辑:重命名变量,并对多个记录添加注释
由于这个问题的性质,我确实假设您想要在另一个记录之后打开单个记录。包含无法在 EF 中执行您想要的操作。

Context.Set<poco>.Find()支持多个字段键
请参阅 Ef 来源 public virtual TEntity Find(params object[] keyValues)

var record = _dataService.TableWithCompositeKey
.Find( Id, InstanceId )
.ToList();

如果您无法使用常规 where 子句获取记录并删除不在键列表中的不需要的条目,则:

a) 单独获取 foreach...
查找(a,b)

b) 动态构建 where 子句 使用类似于谓词构建器(见下文)的东西来构建 where 子句 和 foreach Thischeck = ( a = X and b = Y )//例如为 (Tpoco t)=>value.Equals(t.PropertyName) 创建表达式 Whereclause.Or(thisCheck)

观察,如果您要收集的条目数量较少,则可以考虑个人获得。如果要获取许多记录,则需要考虑生成的Where 子句的大小。这可能最终会对数据库进行全表扫描。

您还需要注意,您生成的 Linq 不会导致在找到所需记录之前将所有记录加载到内存中。

这个问题没有好的解决方案。

/// See http://www.albahari.com/expressions for information and examples.
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }

public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}

public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}

关于entity-framework - 如何在 EF6 中使用组合键从表中搜索记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890482/

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