2009-07-22 6 views
4

안녕하세요. 데이터 테이블이 2 개 (bannedlist, countrylist)인데, 둘 다 국가 별 이름 목록과 대문자 및 참조 번호가 포함되어 있습니다. 세 번째 테이블을 생성하기 위해 bannedlist 테이블에없는 countrylist 테이블에서 국가를 선택할 수있는 쿼리를 수행하려고합니다.Linq가 데이터 테이블에 선택되지 않았습니다.

아이디어가 있으십니까?

나는 이것으로 너무 멀지 않았다.

 var ccList = ds.Tables[2].AsEnumerable(); 
     var bannedCCList = ds.Tables[1].AsEnumerable(); 
     var query = from r in ccList.... 

..

var bannedCCList = ds.Tables[1].AsEnumerable(); 
    var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r; 

을 시도한 후 난 여전히 같은 국가 목록을 얻을. 금지 된 것들은 제거되지 않았습니다. 더 자세한 설명을 위해 여기에 자세한 내용이 나와 있습니다. 확실하지 내가 뭘 잘못

protected void BindCountryBan(string subd) 
{ 
    DataSet ds = new DataSet(); 
    ds = new DB().CountryBan_GetSiteSettings(); 

     BannedCountryListBox.DataSource = ds.Tables[1]; 
     BannedCountryListBox.DataValueField = "cc"; 
     BannedCountryListBox.DataTextField = "country"; 
     BannedCountryListBox.DataBind(); 

//bind country list 
    var ccList = ds.Tables[2].AsEnumerable(); 
    var bannedCCList = ds.Tables[1].AsEnumerable(); 
    var query = from r in ccList where !bannedCCList.Any(b => b["cc"] == r["cc"])select r; 
    //var query = ccList.Except(bannedCCList); 




    //CountryListBox.DataSource = ds.Tables[2]; 
    DataTable boundTable = query.CopyToDataTable<DataRow>(); 
    CountryListBox.DataSource = boundTable; 
    CountryListBox.DataValueField = "cc"; 
    CountryListBox.DataTextField = "country"; 
    CountryListBox.DataBind(); 
} 
+0

다시 내 thingkink 내 문제가 난 그 대신 relallyised 그것을 밖으로 정렬, 그것을 밖으로 내 SQL 쿼리 "Select * country_list 어디 cc에없는 선택 country_list_banned_countries에서 하위 도메인 @ @ 하위 도메인을 클릭하십시오 국가 별 오름차순 "나는 국가 목록에서 금지 된 국가를 추출 할 수 있습니다. 서버 쪽과 투쟁없이 바인딩. 누구나 덕분에 – nLL

답변

7

: 당신이 국가가 금지되지 않은 모든 행을해야 할 경우

using System.Linq; 
... 

    var ccList = from c in ds.Tables[2].AsEnumerable() 
       select c.Field<string>("Country"); 
    var bannedCCList = from c in ds.Tables[1].AsEnumerable() 
         select c.Field<string>("Country"); 
    var exceptBanned = ccList.Except(bannedCCList); 

, 당신은 왼쪽 외부를 시도해 볼 수도 가입 :

var ccList = ds.Tables[2].AsEnumerable(); 
    var bannedCCList = ds.Tables[1].AsEnumerable(); 
    var exceptBanned = from c in ccList 
         join b in bannedCCList 
         on c.Field<string>("Country") equals b.Field<string>("Country") into j 
         from x in j.DefaultIfEmpty() 
         where x == null 
         select c; 
+0

감사합니다. 왼쪽 외부 조인은 예상대로 작동합니다. 한 가지 더 질문하십시오. 메타 나이트의 대답에 대한 내 노트를보십시오. queryresult를 table로 변환하여 결과를 listbox에 바인딩했습니다. 바인딩하는 더 좋은 방법이 있습니까? – nLL

+0

ListBox의 DataTextField 및 DataValueField 값을 바인딩 할 필드의 이름으로 설정해보십시오. 테이블에 복사 할 필요는 없습니다. – dahlbyk

+0

제발 "dahlbyk"나는 VB.Net에서 두 번째 코드가 필요합니다. 나는 "http://converter.telerik.com/"로 변환 할 수 있습니다. addvance 덕택입니다. –

2

를하고있는 중이 야이 시도 :

var query = ccList.Except(bannedCCList); 
+0

그런 방법이 없습니다, 내가 잘못하고있는 건가요? – nLL

+0

필요합니다 : using System.Linq; – DanDan

+0

내가 목록 상자에 쿼리를 바인딩 할 때 System.Data.DataRow가 잘못된 것 같습니다. 다시 – nLL

5

당신은이 같은() LINQ 확장 방법을 제외하고 사용할 수 있습니다 :

var result = full.Except(banned); 

그러나이와 함께 잘 작동합니다 포함되는 형태의 디폴트의 비교자가됩니다.()를 제외하고 사용

from r in ccList 
where !bannedCCList.Any(b => b["cc"] == r["cc"]) 
select r; 

참조가 내가 생각하는 두 컬렉션에서 동일 의미의 경우되지 않습니다 : 당신이 당신의 예에서와 같이 특정 열을 사용하려는 경우 따라서, 당신은 같은 다른 접근 방식이 필요할 수 있습니다 테이블, 또는 내가 틀렸다면 나를 바로 잡습니다. 당신이 국가의 시퀀스에 사용하는 경우 일 것이다 제외하고

+0

명성! List 과 데이터 테이블을 결합해야만 샘플에서 약간의 수정을했고 매력처럼 작동했습니다. – DaniDev

관련 문제