2009-09-11 5 views
1

데이터 테이블과 개체 목록이 있습니다. List의 속성이 특정 값인 DataTable의 모든 행을 반환해야합니다. List는 데이터 테이블을 필터링하는 데만 사용됩니다 (그러나 필터 열은 데이터 테이블에 포함되지 않습니다).목록이있는 DataTable에 가입하십시오. <SomeObject>

저는 이것이 LINQ에서 가능해야한다고 확신합니다.

DataTable에 다음이 포함

MembershipID Username Password 
1    blah  blah  
2    blah  blah  
3    blah  blah  

마이리스트에는 다음이 포함

MembershipID Profile1 Profile2 Profile3 DifferentID 
1    blah  blah  blah A    
2    blah  blah  blah B    
3    blah  blah  blah C    

내가 반환해야 (DataTable을로) - 예 : GetUsersByDifferentID ("B")에 대한 :

MembershipID Username Password 
2    blah  blah  
... 

두 번째 테이블을 DataTable로 가져올 수 있다면 더 쉽게 만들 수 있지만 필요한 것은 LI로 가능하다고 생각합니다. NQ. 나는 마법의 문법에 대해 머리를 맞을 수가 없다. 내가 이해을 couldnt 때문에

답변

2

사용을 할 수있는 조인

List<ListItem> listItems = //whatever 
DataTable dtItems = //whatever 

IEnumerable<DataRow> matchingRows = listItems 
    .Join( dtItems.AsEnumerable(), 
      listItem => listItem.MembershipID, 
      row => row.Field<int>("MembershipID"), 
      (r,li) => new { DifferentId = li.DifferentId, Row = r }) 
    .Where(ji => ji.DifferentID == "B") 
    .Select(ji => ji.Row); 

변경 절은 일치시킬 실제 값을 사용하는 곳 ...

+0

감사합니다. :) – Echilon

+0

@Lee ListCollection을 반환하려고 시도하면 예외가 발생합니다. {System.NotSupportedException : Entity에 대한 LINQ가 메서드를 인식하지 못합니다. System.Data.EnumerableRowCollection1 [System.Data.DataRow] AsEnumerable (System. Data.DataTable) '메서드 이 메서드는 저장소 식으로 변환 할 수 없습니다 .' – joshua

1

나는 이것에 대해 확실하지 오전 당신에 대해 언급하지만 당신은 내 생각이

var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]}); 
+0

나는 그것을 필요로하지만, 다른 방법으로 주위 일치하는 반환 목록의 DifferentID를 기반으로하는 데이터 테이블의 행 . – Echilon

+0

나는 내 대답을 업데이트했다. 시도해 볼 수 있니? –

0

당신이 뭔가하려는 시도 할 수있는 데이터 테이블에 대해 많은 것을 :

var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID); 
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID)); 

이 할 수있다 그것을하는 더 효율적인 방법이 되겠지만 그와 같은 것이 효과가 있습니다.

2

어때?

public class SomeMemberClass 
{ 
    public int MembershipId { get; set; } 
    public char DifferentId { get; set; } 
    //..some more properties 
} 

이 그럼 당신은 같은 것을 할 수 있습니다 :

기본적으로
DataTable table = new DataTable(); 
table.Columns.Add("MembershipId", typeof(int)); 
table.Columns.Add("UserName"); 
table.Columns.Add("Password"); 

List<SomeMemberClass> list = new List<SomeMemberClass>(); //or get the list from somewhere else... 
var differntIds = list.Select(s => s.DifferentId).Distinct(); 

var result = table.AsEnumerable() 
         .Where(dt => differntIds 
         .Contains((int)dt["MembershipId"])) 
         .CopyToDataTable(); 

은, 먼저 모든 별개의 DifferentId 년대를 얻을 다음 테이블을 통해보고 그 사용의 당신의 목록이 클래스의 모음입니다 가정 해 봅시다 .

+0

나는 가까운 사이라고 생각한다. OP가 조회 참조로 목록을 사용하는 것처럼 들리므로 별개 목록 항목에 대해 걱정할 필요가 없다고 생각합니다. 내가 이해하는 방식은 : DifferentID를 전달하고, 목록을 살펴보고 MembershipID를 얻은 다음이를 사용하여 DataTable에서 일치하는 행을 반환합니다. 그런 다음 자체 DataTable로 반환합니다. –

+0

나는 List를 Contains를 호출 할 때 더 적은 수의 요소를 살펴 봐야한다는 점에서 별개의 일을하고있다. – BFree