4

假设我们为一个网格生成了这个链接到 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

4 回答 4

4

如果您的意思是实际将行添加到后端存储,并且假设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 处理能够将这些结果与您的匿名添加相结合。

于 2012-08-29T13:07:48.973 回答
0

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

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

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

于 2012-08-29T13:03:44.717 回答
0

我自己从未尝试过,但这可能会奏效。您可以使用 aDataTable作为存储库,手动添加该行,然后将其用作GridView.

您可以使用此方法将 转换Linq.DataContext 为 a 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/

于 2012-08-29T13:06:37.097 回答
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";
于 2012-08-29T13:07:01.530 回答