2

sourceTablecolumn とで呼び出される Datatable がsource_Idありtitleますprogramme_Id。2 番目の Datatable にはcreditscredit_Id,がありますprogramme_Id。すべての列は、列のタイトルではなく Int 型です。

programme_Idデータテーブルの列creditsは外部キー FROM データテーブルですsourceTable

私が達成したいのは、 DatatablesourceTableの Column でテーブルを超えることです。credit_Idcredits

私は動作するコードを書きましたが、非常に遅いですが、もっと良い方法があります!、探しているアイテムがない場合、FirstOrDefault は 0 を設定します。その場合は 0 ではなく null 値を返す方がよいでしょう。

sourceTable.columns.Add("credits_Id");
var rowColl = credits.AsEnumerable();
foreach (DataRow row in sourceTable.Rows)
{
    var credits_Id =
        (from r in rowColl
         where r.Field<int>("programme_Id") == Convert.ToInt32(row["programme_Id"].ToString())
         select r.Field<int>("credits_Id")).FirstOrDefault<int>();

    row["credits_Id"] = credits_Id;
}
4

2 に答える 2

0

グーグルが誰かをここに連れてきた場合に備えて:これは私が今のところ到達した私の質問に対する解決策です:)

var q = from c in sourceTable.AsEnumerable()
                    join o in credits.AsEnumerable() on c.Field<int>("programme_Id") equals o.Field<int>("programme_Id") into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                    {

                        title=c.Field<string>("title"),

                        credits_Id = (o==null)?-1:o.Field<int>("credits_Id")
                    };
            var qToList = q.ToList();

これで、このリストを Datatable に変換できます。

public static DataTable ListToDataTable<T>(List<T> list)
    {
        DataTable dtToConvert = new DataTable();
        try
        {

        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            dtToConvert.Columns.Add(new DataColumn(info.Name, info.PropertyType));
        }
        foreach (T t in list)
        {
            DataRow row = dtToConvert.NewRow();
            foreach (PropertyInfo info in typeof(T).GetProperties())
            {
                row[info.Name] = info.GetValue(t, null);
            }
            dtToConvert.Rows.Add(row);
        }

        } catch(Exception ex)
            {


            }
        return dtToConvert;
    }

乾杯 !

于 2012-04-16T21:09:54.230 に答える
0

ソーステーブルの各行に対してクレジットテーブルのすべての行を反復処理するため、動作が遅くなります。次の linq クエリを使用して、両方のテーブルを結合できます。

(from sourceRow in sourceTable.Rows.OfType<DataRow>()
join creditRow in credits.Rows.OfType<DataRow>()
   on sourceRow.Field<int>("programme_Id") equals creditRow.Field<int>("programme_Id")
select new {sourceRow, creditRow})
   .ForEach(o => o.sourceRow["credits_id"] = o.creditRow["sourceRow"]);
于 2012-04-13T14:28:08.790 に答える