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);