【问题标题】:Programmatically Add Row to Linq-to-SQL Dataset以编程方式将行添加到 Linq-to-SQL 数据集
【发布时间】:2012-08-29 13:00:08
【问题描述】:

假设我们为一个网格生成了这个链接到 sql 的数据集:

var query = from c in customers
                    orderby c.FirstName
                    select c;

Grid1.DataSet = query;
Grid1.DataBind();

生成此数据集后,我们需要以编程方式将“Vince Vaughn”添加到此数据集(目标是向此 linq-to-sql 数据集添加一行,以便从数据库中获取的值,以及以编程方式添加,都出现在网格中)。

如何使用 C# 以编程方式完成此任务? (即以编程方式将 Vince Vaughn 的一行添加到数据集中)

CUSTOMERS TABLE
ID     FirstName    LastName    
1      John         Jones    
2      Sally        Smith

环境:C#.NET 4.0

提前谢谢你。

【问题讨论】:

  • 在查询中使用.ToList(),然后使用list.Add(new Customer {...})

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


【解决方案1】:

如果您的意思是实际将行添加到后端存储,并且假设 ID 是一个标识列并且您的模型配置正确,您可以这样做。

using (var context =  new ...)
{
    context.customers.Add(
        new Customer { FirstName = "Vince", LastName = "Vaughn" });
    context.SubmitChanges();
}

如果你只是想让文斯看起来好像他在列表中,你可以这样做

var query = customers.Concat(new Customer[]
    { 
        new Customer
            {
                ID = customers.Max(c => c.ID) + 1,
                FirstName = "Vince",
                LastName = "Vaughn"
            }
    }).OrderBy(c => c.FirstName);

这会将文斯添加到列表中,而不会实际将他添加到存储中。


如果您只是想将一个或多个结果“欺骗”到数据库中的一个集合中,您可以连接一组兼容的匿名类型,类似这样...

var queryWithVince = query.Select(r = new 
                    { 
                        FirstName = r.FirstName, 
                        LastName = r.LastName
                    })
    .Concat( new []
        {
            new { FirstName = "Vince", LastName = "Vaughn" }
        }
    .OrderBy(p => p.FirstName);

如果两个匿名类型的成员具有相同的属性名称和类型,则它们是兼容的。如果query 的结果是其他非匿名类型,您需要确保 linq 处理能够将这些结果与您的匿名添加相结合。

【讨论】:

  • 感谢您的详细回复。知道如何向现有查询添加一行(例如向上面的查询变量添加一行)。我的 Linq 查询实际上比我在示例中给出的要复杂一些,并且从许多其他表中加入。基本上,我需要在这个通用的数据汇编中添加一行(它不是任何类类型(如原始示例中的客户)。
  • 那一定是某种匿名类型吧?我会扩展我的答案。
  • @user1410913 回答已扩展。
【解决方案2】:

如果Grid1.DataSet 是IEnumerable<T> 类型并且不是 是DataSet 类型,则没有太多类似的选项

  • 再次从数据库中重新查询所有数据并将其重新分配给控件

  • 在List<T> 中缓存第一个查询数据,查询后仅将“新”数据从数据库中添加到绑定列表中。

【讨论】:

    【解决方案3】:

    我自己从未尝试过,但这可能会奏效。您可以使用DataTable 作为存储库add the row manually,然后将其用作GridView 的数据源。

    您可以使用此方法将Linq.DataContext 转换为DataTable:

    public DataTable ToDataTable(System.Data.Linq.DataContext ctx, object query)
    {
         if (query == null)
         {
              throw new ArgumentNullException("query");
         }
    
         IDbCommand cmd = ctx.GetCommand(query as IQueryable);
         SqlDataAdapter adapter = new SqlDataAdapter();
         adapter.SelectCommand = (SqlCommand)cmd;
         DataTable dt = new DataTable("sd");
    
         try
         {
              cmd.Connection.Open();
              adapter.FillSchema(dt, SchemaType.Source); 
              adapter.Fill(dt);
         }
         finally
         {
              cmd.Connection.Close();
         }
         return dt;
    }
    

    http://www.thejackol.com/2009/06/02/get-linq-to-sql-results-into-a-datatable/

    【讨论】:

      【解决方案4】:
          customers.Add(new Customer {FirstName = "Vaughn" LastName="Vince"});
      
      you can also add a new datarow to your dataset
      
      DataRow row  = ds.Table["customer"].NewRow();
      row["FirstName"] = "Vince";
      row["LastName"] = "VMDFJM";
      

      【讨论】:

        猜你喜欢
        • 2013-07-10
        • 1970-01-01
        • 2010-11-26
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        相关资源
        最近更新 更多