LINQ to SQL插入(如果不存在)

时间:2020-03-06 14:24:54  来源:igfitidea点击:

我想知道如果表中尚不存在插入记录的简便方法。我仍在尝试建立LINQ to SQL技能。

这就是我所拥有的,但似乎应该有一种更简单的方法。

public static TEntity InsertIfNotExists<TEntity>
(
    DataContext db,
    Table<TEntity> table,
    Func<TEntity,bool> where,
    TEntity record
)
    where TEntity : class
{
    TEntity existing = table.SingleOrDefault<TEntity>(where);

    if (existing != null)
    {
        return existing; 
    }
    else
    {
        table.InsertOnSubmit(record);

        // Can't use table.Context.SubmitChanges()
        // 'cause it's read-only

        db.SubmitChanges();
    }

    return record;
}

解决方案

public static void InsertIfNotExists<TEntity>
                    (this Table<TEntity> table,
                     TEntity entity,
                     Expression<Func<TEntity,bool>> predicate)
    where TEntity : class
{ 
    if (!table.Any(predicate)) 
    {
        table.InsertOnSubmit(record);
        table.Context.SubmitChanges();
    }
 }

table.InsertIfNotExists(entity, e=>e.BooleanProperty);

同意马克思的回答,但请参阅注释1.

注意1:恕我直言,在辅助方法中调用db.SubmitChanges()是不明智的,因为我们可能会中断上下文事务。这意味着,如果我们在多个实体的复杂更新过程中调用InsertIfNotExists &lt;TEntity>,则不是一次而是分步保存更改。

注意2:InsertIfNotExists &lt;TEntity>方法是一种非常通用的方法,适用于任何情况。如果我们只想区分从数据库中加载的实体和从代码中创建的实体,则可以使用Entity类的部分方法" OnLoaded",如下所示:

public partial class MyEntity
{
    public bool IsLoaded { get; private set; }
    partial void OnLoaded()
    {
        IsLoaded = true;
    }
}

鉴于此(并注意1),InsertIfNotExists功能将简化为以下内容:

if (!record.IsLoaded)
    db.InsertOnSubmit(record);

马克答案的小修改:

如果我们只关心通过主键检查实体是否存在,则可以使用Marke的答案,如下所示:

public static void InsertIfNotExists<TEntity>
                    (this Table<TEntity> table
                     , TEntity entity
                    ) where TEntity : class
    {
        if (!table.Contains(entity))
        {
            table.InsertOnSubmit(entity);

        }
    }