web-dev-qa-db-ja.com

Linq:データテーブル列の値を選択

datatableの特定の行の特定の列の値を選択するには、LINQ (C#)をどのように使用しますか。同等のSQLは次のようになります。

select NAME from TABLE where ID = 0

前もって感謝します。

27
ianbeks
var name = from r in MyTable
            where r.ID == 0
            select r.Name;

行が一意の場合は、次のようにすることもできます。

var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0);
var name = row != null ? row.Name : String.Empty;
19
James

ご回答ありがとうございます。オブジェクト "MyTable"の種類(答え)がわからなかったため、次のコードで次のエラーが表示されました。

DataTable dt = ds.Tables[0];
var name = from r in dt
           where r.ID == 0
           select r.Name;

ソースタイプ 'System.Data.DataTable'のクエリパターンの実装が見つかりませんでした。 「どこ」が見つかりません

だから私はグーグルを続けて、うまくいくものを見つけました:

var rowColl = ds.Tables[0].AsEnumerable();
string name = (from r in rowColl
              where r.Field<int>("ID") == 0
              select r.Field<string>("NAME")).First<string>();

どう思いますか?

27
ianbeks

他の人が非ラムダ構文を与えていることに気づいたので、これを完全にするために、同等のラムダ構文を入れます:

非ラムダ(ジェームズの投稿による):

var name = from i in DataContext.MyTable
           where i.ID == 0
           select i.Name

同等のラムダ構文:

var name = DataContext.MyTable.Where(i => i.ID == 0)
                              .Select(i => new { Name = i.Name });

実用的な違いはあまりなく、あなたが好む個人的な意見だけです。

7
fyjham

戻り値が文字列で、IDで検索する必要がある場合は、次を使用できます。

string name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")).ToString();

またはジェネリック変数を使用:

var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name"));
1
mbadeveloper

Linqを使用して、データテーブルをEnumerableとして設定し、探しているものと一致するデータテーブルフィールドからフィールドを選択します。

通貨が現地通貨である通貨テーブルから通貨IDと通貨名を取得し、フォームのテキストボックスに通貨​​IDと名前を割り当てます。

DataTable dt = curData.loadCurrency();
            var curId = from c in dt.AsEnumerable()
                        where c.Field<bool>("LocalCurrency") == true
                        select c.Field<int>("CURID");

            foreach (int cid in curId)
            {
                txtCURID.Text = cid.ToString();
            }
            var curName = from c in dt.AsEnumerable()
                          where c.Field<bool>("LocalCurrency") == true
                          select c.Field<string>("CurName");
            foreach (string cName in curName)
            {
                txtCurrency.Text = cName.ToString();
            }
0
Ashraf Abusada
var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString() 
var x  =  from row in table
          where row.ID == 0
          select row

行について知っているDataTableがあると仮定すると、行インデックスを使用する必要があります。

where row[rowNumber] == 0

このインスタンスでは、選択を使用して、行データを匿名クラスまたは事前に準備されたクラスに配置することもできます(別のメソッドに渡したい場合)

0
Chris