2016-02-10 6 views
6

Ich verwende LINQ mit Entity-Framework zum Verbinden von drei Tabellen und ich gebe IList Schnittstelle zurück.foreach auf IEnumerable oder IList

Ich möchte foreach Schleife auf diesen zurückgegebenen Wert anwenden, damit ich Werte in meinem Modell auffüllen kann.

Dies ist, wie ich bin Beitritt:

public IList GetData(long Id) 
{ 
    //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
    var query = from u in dataContext.tblUsers 
    join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
    join c in dataContext.tblComments on u.Id equals c.Commentedby 

    where c.Id == Id 
    select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

    return query.ToList(); 
} 

Ich mag diese Werte in meiner Liste des Modells füllen. Ich habe dies versucht:

var lst = repository.GetDate(Id); 
foreach (var item in lst) 
{ 

} 

Aber ich bin nicht in der Lage Artikel zuzugreifen Firstname/Lastname usw.

Ich habe auch versucht Objekt mit item und object[] item aber beide sind nicht zu arbeiten.

Wie kann ich eine for jede on IList`?

Es wird gut funktionieren, wenn ich in diesem Fall DataTable anstelle von IList zurückgeben kann.

Antwort

7

Sie die Schaffung eines anonymen Typs. Gerade definieren eine Klasse für das Ergebnis der Abfrage, dann wird der Rückgabetyp Ihrer Funktion sollte wie folgt sein:

public IList<YourClassName> GetData(long Id) 
{ 

} 

Set Klasse Werte wie folgt aus:

select new YourClassName 
{ 
    Firstname = u.Firstname, 
    Lastname = u.Lastname, 
    ProfilePicPath = p.ProfilePicPath, 
    Comment = c.Comment, 
    CommentDate = c.CommentDate 
}; 
1

Sie einen anonymen Typ erstellen:

select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 

Wenn Sie diese Daten an andere Methoden übergeben usw. Sie brauchen eine echte Klasse zu erstellen.

public class DataClass 
{ 
    public string Firstname { get; set; } 
    public string LastName{ get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public DateTime CommentDate { get; set; } 
} 

und verwenden es:

public IList<DataClass> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
    select new DataClass 
    { 
     Firstname = u.Firstname, 
     Lastname = u.Lastname, 
     ProfilePicPath = p.ProfilePicPath, 
     Comment = c.Comment, 
     CommentDate = c.CommentDate 
    }; 

    return query.ToList(); 
} 
0

Sie verwenden einen anonymen Typ Sie können es also nicht auf irgendwas anwenden, wenn Sie Ihre Liste durchlaufen. Sie könnten versuchen, dynamic statt var verwenden, was bedeutet, Sie jede Eigenschaft auf sie anrufen können, solange es zur Laufzeit vorhanden ist:

foreach (dynamic item in lst) 
{ 
    string firstName = item.FirstName; 
} 

oder explizit eine Klasse für das Ergebnis Element definiert, wie die anderen Antworten sind darauf hindeutet.

0

Sie müssen GetData Rückgabetyp ändern. Bitte versuchen Sie folgendes:

public List<tblUsers> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new tblUsers { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate }; 
      return query.ToList(); 
     } 
1

Sie sollten nicht nur IList Schnittstelle sondern parametrisierte Schnittstelle mit Ihrem Typ zurückgeben. Jetzt returintint anounymouse Objekt.

Also was ich vorschlagen möchte.Erstellen Sie diese Klasse:

public class MyCustomContainer 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public string ProfilePicPath { get; set; } 
    public string Comment { get; set; } 
    public string CommentDate { get; set; } 
} 

und die Änderung Ihrer Methode wie folgt aus:

public IList<MyCustomContainer> GetData(long Id) 
     { 
      //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),) 
      var query = from u in dataContext.tblUsers 
         join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
         join c in dataContext.tblComments on u.Id equals c.Commentedby 
         where c.Id == Id 
         select new MyCustomContainer 
         { 
          Firstname = u.Firstname, 
          Lastname = u.Lastname, 
          ProfilePicPath = p.ProfilePicPath, 
          Comment = c.Comment, 
          CommentDate = c.CommentDate 
          }; 
      return query.ToList(); 
     } 

Jetzt zurückkehren Sie nicht Objekt aus der Liste Anonymouse, so dass Sie alle Eigenschaften, die Sie benötigen

4

Sie Rückkehr bekommen eine anonymous Liste von objects in der Methode. Sie können auf die Eigenschaften mithilfe der Reflektion zugreifen, dies ist jedoch zur Laufzeit nicht sehr langsam. Am einfachsten erhalten Sie Informationen, indem Sie eine Klasse definieren und diese in der select-Anweisung verwenden.

public class Person 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    /* ... */ 
} 

public IList<Person> GetData(long Id) 
{ 
    var query = from u in dataContext.tblUsers 
       join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id 
       join c in dataContext.tblComments on u.Id equals c.Commentedby 
       where c.Id == Id 
       select new Person { u.Firstname, u.Lastname /* ... */ }; 
     return query.ToList(); 
} 
Verwandte Themen