【问题标题】:How to populate a table by Insert or Update如何通过插入或更新来填充表格
【发布时间】:2014-08-17 05:15:14
【问题描述】:

我通过 BLToolkit 访问数据库。我的一张桌子有:

  • 字段:Id、TeamId、PlayerId、Val1、Val2
  • 主键 - 字段 ID,自动递增
  • 由 2 个字段 TeamId 和 PlayerId 组成的复合唯一键
  • 数据字段 Val1、Val2

我已经创建了对象列表:

List<MyObj> objs = new []{
    new MyObj{TeamId=2, PlayerId=3, Val1=1234, Val2=111},
    new MyObj{TeamId=2, PlayerId=4, Val1=2345, Val2=444},
    new MyObj{TeamId=2, PlayerId=5, Val1=3456, Val2=666},
    };

我可以使用

将所有这些对象插入数据库
db.InsertBatch(objs);

但是某些具有相同复合键的记录可能已经在数据库中,因此我希望自动执行这些对象的更新,而不是 INSERT。

我知道 BLToolkit 有 InsertOrUpdate 和 InsertOrReplace,但它们都只使用 1 个对象。

有什么方法可以插入或更新/替换 1 个对 DB 的请求中的对象列表?

谢谢。

附:事实上,我在 objs 中列出的数据不是以编程方式创建的,它们是最近根据查询其他表从 DB 中提取的。也许在获取这些数据的同时,我应该尝试获取现有对象的 ID 并使用此信息来决定插入或更新?

【问题讨论】:

    标签: c# .net linq bltoolkit


    【解决方案1】:

    如果您的对象来自另一个表,您可以进行左连接来对需要插入或更新的对象进行排序:

    var useInsertQuery = from o in db.OtherObjs
                join m in db.MyObjs on new { m.TeamId, m.PlayerId } equals new { o.TeamId, o.PlayerId } into moJoin
                from mo in moJoin.DefaultIfEmpty()
                let useInsert = (mo == null)
                // MyObj f(OtherObj otherObj) creates your updated MyObj value
                group f(m,o) by useInsert into g;
    var useInsertDictionary = useInsertQuery.ToDictionary(g => g.Key, g => g.ToArray());
    
    MyObj[] objs;
    if (useInsertDictionary.TryGetValue(true, out objs))
        db.InsertBatch(objs);
    if (useInsertDictionary.TryGetValue(false, out objs))
        db.Update(objs);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 2016-02-16
      • 2019-11-11
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多