以编程方式将行添加到Linq-to-SQL数据集

时间:2012-08-29 13:00:09

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

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

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

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

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

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

CUSTOMERS TABLE
ID     FirstName    LastName    
1      John         Jones    
2      Sally        Smith

环境:C#.NET 4.0

提前谢谢。

4 个答案:

答案 0 :(得分:4)

如果您的意思是实际将行添加到后端存储中,并且假设ID是标识列并且您的模型配置正确,则可以执行此操作。

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

如果你只是希望Vince出现在你可以做的列表中

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

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


如果您只想将结果或结果“欺骗”到数据库的集合中,您可以使用一组兼容的匿名类型进行连接,就像这样......

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处理能够将这些结果与您的匿名添加相结合。

答案 1 :(得分:0)

如果Grid1.DataSet类型为IEnumerable<T>属于DataSet类型,则没有多少选项,例如

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

  • cach List<T>中的第一个查询数据,查询后只有“新”数据形成数据库并将其添加到绑定列表中。

答案 2 :(得分:0)

我自己从未尝试过,但这可能有用。您可以使用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/

答案 3 :(得分:0)

    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";