2013-12-11 2 views
1

작은 Access 데이터베이스에 액세스하고 일부 테이블을 데이터 집합 안에 넣습니다. 그런 다음 LINQ를 사용하여 테이블을 쿼리해야합니다. 내가 LINQ 꽤 새로운 그리고 난 다음 코드로 잘못 이해하지 않는 : 데이터 인쇄LINQ 결과 집합의 열을 액세스 할 수 없습니다.

DataTable cours = autOuvrDS.Tables["cours"]; 
DataTable etudiants = autOuvrDS.Tables["etudiants"]; 
DataTable resultats = autOuvrDS.Tables["resultats"]; 

IEnumerable<DataRow> query = from etudiant in etudiants.AsEnumerable() 
          join resultat in resultats.AsEnumerable() 
          on etudiant.Field<string>("matricule") equals resultat.Field<string>("matricule") 
          join cour in cours.AsEnumerable() 
          on resultat.Field<string>("sigle") equals cour.Field<string>("sigle") 
          select etudiant; 

DataTable table = query.CopyToDataTable<DataRow>(); 

그럼 루프 쓰루, 각 행 :

foreach (DataRow row in table.Rows) 
     { 
      Console.WriteLine(
       row.Field<string>("Prenom") + "\t\t" + 
       row.Field<string>("Nom") + "\t\t" + 
       row.Field<string>("Sigle") + "\t\t" + /// PROGRAM CRASH HERE 
       row.Field<string>("Cours") + "\t\t" 
       ); 
     } 

을하고 다음을 얻을 프로그램을 실행할 때 오류 : "추가 정보 : 'Sigle'열이 테이블에 속하지 않습니다."

"Sigle"열은 "cours"테이블의 일부입니다.이 쿼리는 조인 된 테이블의 열을 선택하는 것이 좋을 것입니다.하지만 그렇지 않은 것 같습니다. .. 그래서 어떻게 다른 테이블에서 열을 선택할 수 있습니까 ??

+0

여기에 PROGRAM CRASH 위치에 berakpoint를 넣고 잘못된 열 이름으로 액세스했는지 또는 잘못된 데이터 유형으로 전송했는지 확인하십시오. – YOusaFZai

답변

0

쿼리가 DataRow 개체 세 세트를 결합한 다음 해당 개체 중 하나 인 출력을 DataRow 개로 선택합니다. 결과 table 오브젝트에는 etudiants 원본 테이블에서만 발생하는 행이 들어 있습니다.

var query = 
    from etudiant in etudiants.AsEnumerable() 
    join resultat in resultats.AsEnumerable() 
    on etudiant.Field<string>("matricule") equals resultat.Field<string>("matricule") 
    join cour in cours.AsEnumerable() 
    on resultat.Field<string>("sigle") equals cour.Field<string>("sigle") 
    select new QueryResult 
    { 
     Prenom = etudiant.Field<string>("Prenom"), 
     Nom = etudiant.Field<string>("Nom"), 
     Sigle = resultat.Field<string>("Sigle"), 
     Cours = resultat.Field<string>("Cours") 
    }; 

List<QueryResult> results = query.ToList(); 

foreach (QueryResult row in results) 
{ 
    Console.WriteLine("{0}\t\t{1}\t\t{2}\t\t{3}\t\t", 
     row.Prenom, row.Nom, row.Sigle, row.Cours 
    ); 
} 

당신에게 : 쿼리를 실행할 때 다음

public struct QueryResult 
{ 
    public string Prenom; 
    public string Nom; 
    public string Sigle; 
    public string Cours; 
} 

: 당신은 당신이 나열된 필드 만합니다

,이 유사한 결과를 보유하는 구조를 선언 할 수 익명 형식을 사용할 수 있지만 결과를 인스턴스를 만드는 메서드 외부에서 사용하지 않는 경우에만 사용할 수 있습니다. 이 점을 믿어주세요. 결과가 단일 메서드의 내부에 완전히 포함되어 있지 않으면 구조체를 선언하는 것이 더 간단합니다.

이 같은 쿼리를 수행하고 결과에서 필드 값의 선택 가득 DataTable 생성합니다 : DataTable 구현


업데이트

var query = 
    from etudiant in etudiants.AsEnumerable() 
    join resultat in resultats.AsEnumerable() 
    on etudiant.Field<string>("matricule") equals resultat.Field<string>("matricule") 
    join cour in cours.AsEnumerable() 
    on resultat.Field<string>("sigle") equals cour.Field<string>("sigle") 
    select new { etudiant, cour }; 


// Définir la structure de la table de sortie 
DataTable table = new DataTable(); 
table.Columns.Add("Prenom", typeof(string)); 
table.Columns.Add("Nom", typeof(string)); 
table.Columns.Add("Sigle", typeof(string)); 
table.Columns.Add("Cours", typeof(string)); 

// Remplir la table de sortie à partir la requête 
foreach (var row in query) 
{ 
    DataRow newrow = table.NewRow(); 
    newrow["Prenom"] = row.etudiant.Field<string>("Prenom"); 
    newrow["Nom"] = row.etudiant.Field<string>("Nom"); 
    newrow["Sigle"] = row.cour.Field<string>("Sigle"); 
    newrow["Cours"] = row.cour.Field<string>("Cours"); 
    table.Rows.Add(newrow); 
} 

을 아마 거기있는 동안 코드와 실제 런타임 모두에서이를 달성하는보다 효율적인 방법은 .NET 중심 양식 대신 DataTable을 사용하도록 제한되어 있다는 것입니다. at는 내가 보통 만나지 않을 무언가이다.

+0

이 방법이 효과적이지만 결과 세트를 DataTable에 넣어야합니다. "var"대신 "IEnumerable "쿼리를 다시 시도했지만 두 번째 조인시 오류가 발생합니다. "암시 적으로 'System.Collections.Generic.IEnumerable <>' '을'System.Collections '형식으로 변환 할 수 없습니다. .Generic.IEnumerable '명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?) " – SimCity

+0

왜 DataTable이 있어야합니까? 이 'DataTable'의 형식은 무엇입니까? – Corey

+0

사실 이건 숙제 문제의 일부로 데이터 테이블 안에 레스톱 세트를 넣으려고하기 때문에 테이블에 넣는 것만 큼 중요한 이유가 없습니다. 나는 너무 확신하지 못합니다. 테이블 형식? – SimCity

1

당신은 Sigle이 cours 테이블에 속한다고 썼지 만 LINQ 쿼리에서 etudiants 테이블 : select etudiant에서만 데이터를 선택했습니다. 따라서 해당 열은 출력에 포함될 수 없습니다. 코드를 자세히 살펴보십시오.