【问题标题】:How do I add to a list with Linq to SQL?如何使用 Linq to SQL 添加到列表中?
【发布时间】:2010-09-16 05:10:24
【问题描述】:

我在数据库中有一个表,我正在使用 LINQ to SQL 检索它,作为我处理的一部分,我想添加到这个列表中,然后用新项目和我所做的任何更改更新数据库.

我认为我能做的是:

var list = (from item in db.Table
            select item).ToList();

[do processing where I modify items & add to the list]

list = list.Distinct();

db.SubmitChanges();

发生的情况是修改发生了(即 SQL 更新),但我添加到列表中的任何新项目都没有被添加。

显然我做错了,修改和添加到数据库实体列表,然后提交所有更新和插入的正确方法是什么?

【问题讨论】:

    标签: c# .net sql linq linq-to-sql


    【解决方案1】:

    您必须通过 InsertOnSubmit 添加新项目。

    【讨论】:

    • 是的,我知道 insertonsubmit,我希望有一种更优雅的方式在同一个列表中进行插入和更新
    【解决方案2】:

    列表毫无意义。它只是碰巧保存了 DataContext 知道的对象。我们需要确保 DataContext 知道新的。重要的是,当我们向 DataContext 提醒它们时,它们不必是完整的:

    Item item;
    if (needNewOne)
    {
         item = new Item();
         db.InsertOnSubmit(item);
    }
    else
    {
         item = list[i];
    }
    ///  build new or modify existing item
    ///   :
    db.SubmitChanges();
    

    【讨论】:

      【解决方案3】:

      您必须使用 InsertOnSubmit 告诉 LINQ 在提交时插入新行:

      db.InsertOnSubmit(newrow);
      db.SubmitChanges();
      

      您不需要新的 DataContext,您可以使用您正在使用的进行更新。

      删除 DeleteOnSubmit(row) 也是如此。不过,修改将被跟踪。

      【讨论】:

        【解决方案4】:

        你可以为它创建一个扩展方法:

        static void EnsureInsertedOnSubmit<TEntity>( this Table<TEntity>  table
                                                    ,IEnumerable<TEntity> entities)
         { foreach(var entity in entities) 
            { if  (   table.GetModifiedMembers(entity).Length == 0     
                   && table.GetOriginalEntityState(entity) == default(TEntity))
               { table.InsertOnSubmit(entity);
               }
            }
         }
        

        然后你可以这样做:

         var list = db.Table1.ToList();
         list.Add(new Item());
         db.Table1.EnsureInsertedOnSubmit(list);
         db.SubmitChanges();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多