2012-04-03 14 views
2

Ich habe die Liste der ProjectId wie 14,15,18, und ich möchte diese Elemente aus meiner Datentabelle mit Linq suchen.wie IN-Operator in LINQ zu verwenden

jetzt habe ich die Abfrage wie

IEnumerable<DataRow> drProjList = from a in dtProj.AsEnumerable() 
            where a.Field<int>("ProjectId") 
             .ToString() 
             .Contains(projFilter) 
            select a; 

, aber ich bin nicht immer die 0 Elemente erstellt.

kann mir jeder Körper einen anderen Weg wie IN Operator in Linq vorschlagen.

Dank im Voraus

EDIT projFilter ist die reine Zeichenfolge, die den 14,15,18, ... Projekt-IDs haben.

+0

Welche Art von 'projFilter' ist? – MarcinJuraszek

+0

@MarcinJuraszek es ist eine Zeichenfolge mit dem Komma getrennt ProjectId –

Antwort

1

Ich weiß nicht viel über die AsEnumerable(), aber ich hätte es andersherum gemacht, so etwas wie dieses:

List<int> intProjFilter = new List<int>(); 

foreach(string filter in projFilter.Split(',')) 
     intProjFilter.Add(int.Parse(filter)); 

from a in dtProj 
where projFilter.Contains(a.ProjectID) 
select a; 

Lassen Sie mich wissen, ob dies

hilft
+0

Aber wahrscheinlich ohne die '.ToString()'. –

+0

Ich dachte, es wäre da, weil der ProjFilter eine Liste von Strings war. Sie könnten Recht haben, obwohl –

+0

Hi @ExitMusic, funktioniert diese Lösung für mich, aber es gibt auch die 1,4,8 mit dem 14,15,18 :( –

0

Vielleicht etwas dies wie:

IEnumerable<DataRow> drProjList = 
         (
          from a in dtProj.AsEnumerable() 
          where projFilter.Contains(a.Field<int>("ProjectId").ToString()) 
          select a; 
         ) 

Oder Sie können dies einfach tun, wie gut:

IEnumerable<DataRow> drProjList=dtProj.AsEnumerable() 
            .Where(a=>projFilter 
              .Contains(a.Field<int>("ProjectId") 
              .ToString())); 
+0

, das zeigen Fehler, dass 'die beste Überladungsmethode für String.Contains (String) hat einige ungültige Argumente. Ich denke der 'a.Field (" ProjectId ")' braucht 'ToString()' –

+0

die Antwort aktualisieren – Arion

+0

hi @ Arion, danke für schnelle Antwort.Ich bekomme das gleiche wie die Abfrage von ExitMusic.Wie ich vermeiden werde diese zusätzlichen 1,4,8 ProjectIds? –

0

Ich weiß nicht, C# gut, also ich versuche, Antwort in vb.net hoffe, dass Ihnen helfen wird.

Dim dtProj As DataTable 
    dtProj = FillProjectList() 

    Dim projIdFilter() As Integer = {14, 15, 16} 

    Dim drRow = From p In dtProj.AsEnumerable _ 
     Where projIdFilter.Contains(p.Field(Of Integer)("ProjectId")) _ 
     Select p 

Danke ...

3

String ist "enthält" ist hier nicht wirklich eine Option. Sie sollten projFilter zuerst in eine richtige Liste von Ganzzahlen konvertieren.

var projFilter2 = new HashSet<int>(projFilter.Split(',').Select(i => int.Parse(i))); 

und erst dann prüfen, ob es die gewünschte Nummer enthält.

IEnumerable<DataRow> drProjList = 
    from a in dtProj.AsEnumerable() 
    where projFilter2.Contains(a.Field<int>("ProjectId")) 
    select a; 
1

Sie müssen zuerst den Projektfilter in eine Sammlung von Ganzzahlen zerlegen.

var projectIds = projFilter.Split(',').Select(x => Convert.ToInt32(x)).ToList(); 

var drProjList = 
    from a in dtProj.AsEnumerable() 
    where projectIds.Contains(a.ProjectId) 
    select a; 
+0

oops einen Tippfehler behoben. Angenommen, ToList() anstelle von ToString() – Fnop