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

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

谢谢您的提前帮助。


1
在查询上使用 .ToList(),然后使用 list.Add(new Customer {...}) - Guillaume86
4个回答

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


感谢您详细的回复。您有任何想法如何向现有查询添加一行(例如向上面的查询变量添加一行)吗?我的Linq查询实际上比我在示例中给出的更复杂,并且连接了许多其他表。基本上,我需要向这个通用的数据编译添加一行(它不属于任何类类型(例如原始示例中的客户)。 - flying227
那么它必须是某个匿名类型,对吧?我会进一步解释我的答案。 - Jodrell
@user1410913的回答已经扩展了。 - Jodrell

0

我自己从未尝试过,但这可能有效。您可以使用 DataTable 作为存储库,手动添加行,然后将其用作 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/


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

0

如果 Grid1.DataSet 的类型是 IEnumerable<T> 而不是 DataSet 类型,那么就没有太多选择了,例如:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接