linq - 您将如何编写LINQ to SQL的Upsert?

标签 linq linq-to-sql

因此,我想为LINQ to SQL编写一个通用的Upsert函数,但是在概念上很难做到这一点。我希望它能像这样工作:

var db = new DataContext();
db.Customers.UpsertOnSubmit(customer);


因此,它在某种程度上必须是通用的,我想是对Table的扩展方法。我已经能够确定基础表的主键了:

var context = source.Context;
var table = context.Mapping.GetTable(source.GetType());
var primaryMember = table.RowType.DataMembers.SingleOrDefault(m => m.IsPrimaryKey);


我假设有必要使它组成一个查询,以告知该项目是否已在数据库中,但是我现在真的不知道该如何处理。

最佳答案

我做了类似的事情,但是使用了不同的方法。每个实体都实现IEntityIEntity的属性之一是对象是新对象还是现有状态。然后,我为每个实体实现该功能,例如:

public EntityState EntityState
{
    get
    {
        if (_Id > 0)
            return EntityState.Exisiting;
        else
            return EntityState.New;
    }
}


然后,通用Upsert可以是(在通用存储库类型类上):

public virtual void Upsert<Ta>(Ta entity)
    where Ta: class
{
    if (!(entity is IEntity))
        throw new Exception("T must be of type IEntity");

    if (((IEntity)entity).EntityState == EntityState.Exisiting)
        GetTable<Ta>().Attach(entity, true);
    else
        GetTable<Ta>().InsertOnSubmit(entity);
}

private System.Data.Linq.Table<Ta> GetTable<Ta>()
    where Ta: class
{
    return _dataContext.Context.GetTable<Ta>();
}


如果您是从另一个数据上下文附加的,还请确保您的对象带有时间戳。

关于linq - 您将如何编写LINQ to SQL的Upsert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637225/

相关文章:

c# - Linq2SQL 按运行时已知的属性分组

c# - 在 linq 中使用 out 类型

linq - .Net 4.0 中有哪些实现 IQueryable<T> 的可实例化类型可用?

c# - 如何在查询 XML 时在 LINQ 中添加 OR 条件?

c# - 在 SQL Server 中将 varchar 和 char 转换为 nvarchar 和 nchar 是否安全?

sql-server - 为什么我只使用 LinqToSql 和 Ado.Net 时 TransactionScope 使用分布式事务

c# - 根据单元格值过滤datagridview中的对象列表

c# - 如何从 Linq 中的配置文件的 Appsettings 获取键和值

c# - 如何使用 itextsharp 获取 html 内容并将其转换为 PDF?

c# - Linq to Entities 中的自定义联盟