繁体   English   中英

实体框架AddOrUpdate实现

[英]Entity Framework AddOrUpdate implementation

我正在尝试创建类似于AddOrUdpate的扩展方法。

用法应如下所示:

var student = context.Students.GetOrCreate(
    s => s.Name, 
    new Student() { Name = "SomeName" })

如果有任何具有该名称的用户,则应将其返回,否则它将创建新用户。

这就是我所拥有的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM