Entity Framework AddOrUpdate 实现
Entity Framework AddOrUpdate implementation
我正在尝试创建类似于 AddOrUdpate 的扩展方法。
用法应该是这样的:
var student = context.Students.GetOrCreate(
s => s.Name,
new Student() { Name = "SomeName" })
如果有任何用户使用该名称,它应该 return 它,否则它应该创建新用户。
这是我的:
public static TEntity GetOrCreate<TEntity>(
this IDbSet<TEntity> set,
Expression<Func<TEntity, object>> identifierExpression,
TEntity entity) where TEntity : class
{
var func = identifierExpression.Compile();
var id = func.Invoke(entity);
var persistedEntity = set.FirstOrDefault(e => func.Invoke(e) == id);
if (persistedEntity != null)
{
return persistedEntity;
}
return set.Add(entity);
}
但我无法使用 LINQ to Entities 调用 invoke
。
我应该如何使用 identifierExpresion
?
使用它创建一个新表达式,您可以将其传递给 FirstOrDefault,并让 EF 提供程序处理将表达式转换为 SQL。新表达式将测试与您从已编译和调用的表达式中检索到的 ID 是否相等。像这样:
var equalityExpr = Expression.Equal(identifierExpression.Body, Expression.Constant(id));
var findMatchExpr = Expression.Lambda<Func<TEntity, bool>>(equalityExpr, identifierExpression.Parameters);
var persistedEntity = set.FirstOrDefault(findMatchExpr);
我正在尝试创建类似于 AddOrUdpate 的扩展方法。
用法应该是这样的:
var student = context.Students.GetOrCreate(
s => s.Name,
new Student() { Name = "SomeName" })
如果有任何用户使用该名称,它应该 return 它,否则它应该创建新用户。
这是我的:
public static TEntity GetOrCreate<TEntity>(
this IDbSet<TEntity> set,
Expression<Func<TEntity, object>> identifierExpression,
TEntity entity) where TEntity : class
{
var func = identifierExpression.Compile();
var id = func.Invoke(entity);
var persistedEntity = set.FirstOrDefault(e => func.Invoke(e) == id);
if (persistedEntity != null)
{
return persistedEntity;
}
return set.Add(entity);
}
但我无法使用 LINQ to Entities 调用 invoke
。
我应该如何使用 identifierExpresion
?
使用它创建一个新表达式,您可以将其传递给 FirstOrDefault,并让 EF 提供程序处理将表达式转换为 SQL。新表达式将测试与您从已编译和调用的表达式中检索到的 ID 是否相等。像这样:
var equalityExpr = Expression.Equal(identifierExpression.Body, Expression.Constant(id));
var findMatchExpr = Expression.Lambda<Func<TEntity, bool>>(equalityExpr, identifierExpression.Parameters);
var persistedEntity = set.FirstOrDefault(findMatchExpr);