2009-12-10 1 views
24

LINQ (C#)을 사용하여 datatable의 특정 행에 대한 특정 열의 값을 어떻게 선택합니까? 해당 SQL은 다음과 같습니다.Linq : 데이터 테이블 열의 값 선택

select NAME from TABLE where ID = 0 

미리 감사드립니다. 행이 고유 경우

답변

16
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; 
+0

사실상 SingleOrDefault 호출을 호출하면 문자 그대로 SQL로 번역 된 모든 열이 실제로 선택됩니다 (IQueryable이 아닌 MyTable 객체를 반환 함). select 메소드가 수행 할 수없는 성능 영향을 줄 수있는 테이블에있는 항목에 따라 다 (니다. 전형적인 테이블에서 가독성은 아마도 작은 성능 차이의 가치가있을 것입니다. 그러나 질문은 동등한 SQL에 관한 것이므로 명확히 할만한 가치가 있다고 생각했습니다. – fyjham

+0

SingleOrDefault는 집합에서 고유 항목을 검색 할 때 가장 적절하게 사용됩니다. OP의 그것 소리에 의해 어느 쪽. – James

+0

이 작업은 SingleOrDefault와 동일하게 작동합니다. 감사합니다 – ianbeks

0
var x = from row in table 
      where row.ID == 0 
      select row 

은 행에 대해 알고 DataTable을, 현명한 다른 사용자가 행을 사용해야합니다을 가정하면 색인 :

where row[rowNumber] == 0 

이 경우 선택을 사용하여 행 데이터를 익명의 클래스 또는 준비된 클래스에 배치 할 수도 있습니다. 의 나는 다른 사람들이 그래서 그냥 내가 람다 구문 동등한 놓을 게요이 완료 가지고 비 람다 구문을 준 알

7

(다른 방법으로 전달하려는 경우) : (

비 람다) 제임스의 게시물 당 :

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

.

+0

당신의 람다 대답이 표시된 것보다 정확하다고 생각합니다. SingleOrDefault()는 행의 모든 ​​열을 가져옵니다 (OP가 요청한 것이 아니며 OP는 한 열에 만 요청 됨). Where() 및 Select() 조합은 모든 열을 반입하는 것보다 필요한 열을 반입합니다. 내가 잘못하면 Plz 날 정정 해. – gsk

+0

네 말이 맞아. 마지막에 ".SingleOrDefault()"를 할 수도 있습니다 (예 :'string name = DataContext.MyTable.Where (i => i.ID == 0) .Select (i => i.Name) .SingleOrDefault();'1 열만 다시 쿼리합니다). SingleOrDefault에 대해 본질적으로 "fetch-all"은 없습니다. 쿼리를 체인화해야합니다. 그렇지만 성능 열의 오버 헤드는 일반적으로 다른 열에 매우 큰 데이터가 없으면 무시할 수 있습니다. – fyjham

23

답장을 보내 주셔서 감사합니다. "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>(); 

당신은 어떻게 생각하세요?

+0

'.AsEnumerable'을 사용하려면 dll 'System.Data.DataSetExtensions'및 using 문을 추가해야합니다! – KennyZ

+0

위의 수정 된 주석 : '.AsEnumerable'을 사용하려면 'System.Data.DataSetExtensions'이라는 dll을 추가해야합니다! 그것을 위해 using 문을 사용하지 마십시오! System.Data를 사용하고 .dll에 대한 참조를 사용하면이 작업을 수행 할 수 있습니다. – KennyZ

+1

AsEnumerable은 질의의 컨텍스트를 전환하여'where/select'가 DB 측이 아니라 메모리에서 수행되도록합니다. – James

0
var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString() 
0

linq를 사용하고 데이터 테이블을 Enumerable로 설정하고 데이터 테이블 필드에서 찾고자하는 것과 일치하는 필드를 선택하십시오.

내가 통화가 현지 통화 통화 테이블에서 통화 아이디 및 통화 이름을 얻고, 폼에 텍스트 상자에 통화 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(); 
      } 
1

반환 값은 문자열이며, 당신이 사용할 수있는 당신은 ID를 기준으로 정보를 검색해야하는 경우 :

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

또는 GE를 사용하여 Neric 변수 :

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

문자열 이름 = datatable.AsEnumerable(). 여기서 (행 => Convert.ToInt32 (행 [ "Id"]) == Id) .Select (행 => 행. 필드 ("이름")).먼저(); – mbadeveloper