2012-08-29 24 views
2

比方說,我們生成此鏈接到SQL的數據集爲一個網格:編程方式添加行LINQ到SQL數據集

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

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

生成該數據集後,我們需要以編程方式添加「文斯·沃恩」來此數據集(目標是向此linq-to-sql數據集添加一行,以便從數據庫中獲得的值以及以編程方式添加的1行全部出現在網格中)。

如何以編程方式使用C#完成此操作? (即編程爲文斯沃恩添加一行到數據集)

CUSTOMERS TABLE 
ID  FirstName LastName  
1  John   Jones  
2  Sally  Smith 

環境:C#.NET 4.0

預先感謝您。

+1

使用'。ToList()'然後是'list.Add(new Customer {...})' – Guillaume86

回答

0

如果Grid1.DataSetIEnumerable<T>類型和DataSet型的,沒有太多選項,如

  • 重新查詢從資料庫,並再次所有數據重新指定到控制

  • 緩存List<T>中的第一個查詢數據,並在查詢「新」數據形式的數據庫並將其添加到綁定列表中。

0

我從來沒有嘗試過,但這可能會奏效。您可以使用DataTable作爲存儲庫,add the row manually,然後將其用作GridView的數據源。

您可以使用此方法來轉換Linq.DataContextDataTable

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

這將增加了文到列表中,而無需實際增加他到存儲。


如果你只是想「惡搞」的結果或結果爲一組從數據庫,你可以用一組兼容的匿名類型,財產以後這樣的concatentate ...

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處理能夠將這些結果與匿名添加結合起來。

+0

謝謝你的詳細回覆。任何想法如何將一行添加到現有的查詢(如向上面的查詢變量添加一行)。我的Linq查詢實際上比我在示例中給出的查詢要複雜一些,並且從許多其他表中加入。基本上,我需要添加一行到這個通用的數據編譯中(它不是任何類的類型(例如原始示例中的客戶)。 – flying227

+0

它必須是某種匿名類型,那麼對嗎?我會擴展我的答案 – Jodrell

+0

@ user1410913回答擴展。 – Jodrell

相關問題