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は、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);

これにより、Vince が実際にストレージに追加されることなく、Vince がリストに追加されます。


結果または結果をデータベースからセットに「偽装」したいだけの場合は、互換性のある匿名型のセットと連結できます。次のように...

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

メンバーのプロパティ名と型が同じである場合、2 つの匿名型は互換性があります。の結果がquery他の非匿名型である場合は、linq 処理がそれらの結果を匿名の追加と組み合わせることができることを確認する必要があります。

于 2012-08-29T13:07:48.973 に答える
0

Grid1.DataSetタイプでありDataSetIEnumerable<T>タイプではない場合、次のような多くのオプションはありません

  • データベースからすべてのデータを再クエリし、コントロールに再割り当てします

  • 最初のクエリ データを にキャッシュしList<T>、クエリの後にのみ「新しい」データ フォーム データベースをキャッシュし、それをバインド リストに追加します。

于 2012-08-29T13:03:44.717 に答える
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/

于 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 に答える