2016-02-10 6 views
6

エンティティフレームワークでLINQを使用して3つのテーブルを結合していますが、IListインターフェイスを返しています。IEnumerableまたはIListのforeach

foreachループをこの戻り値に適用したいので、モデルに値を設定できます。

これは私が参加しています方法です:

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(); 
} 

私はモデルの私のリストに、これらの値を移入します。私はまた、オブジェクトitemobject[] itemを使用してみましたが、彼らの両方があまりにも機能していないなど

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

} 

しかし、私はアイテムFirstname/Lastnameにアクセスすることができません:私はこれを試してみました。

forそれぞれを IList`に適用するにはどうすればよいですか?

この場合はIListの代わりにDataTableを返すことができます。

答えて

7

あなたは匿名型を作成しています。あなたは匿名型を使用している

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

あなたは匿名型作成している:あなたはなど、他の方法には、このデータを渡したい場合は、実際のクラスを作成する必要が

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

を。

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; } 
} 

し、それを使用します。

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

:このような

public IList<YourClassName> GetData(long Id) 
{ 

} 

Setクラス値:ちょうどその時、あなたの関数の戻り値の型は、このようにする必要があり、クエリの結果のためのクラスを定義しますあなたのリストをループするときに何にでもキャストすることはできません。

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

または明示的に他の回答が示唆されているように、結果項目のクラスを定義する:あなたは、あなたがいる限り、それは実行時に存在しているとして、その上に任意のプロパティを呼び出すことができることを意味dynamic代わりのvarを使用して試みることができます。

0

変更する必要がありますGetData戻り値の型。これを試してください:

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

あなたはIListインターフェースだけでなく、あなたのタイプとパラメータ化されたインターフェースを返すべきです。今、あなたはanounymouseオブジェクトをreturtintします。

私は何を提案したいのですか?あなたは、あなたが戻っている

4

を必要とするすべてのプロパティを取得することができますので、リスト内のオブジェクトをanonymouseない返す今

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(); 
     } 

:このような

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; } 
} 

と変更あなたの方法:このクラスを作成します。この方法におけるのリストはanonymousである。リフレクションを使用してプロパティにアクセスできますが、これは実行時には遅いです。型情報を取得する最も簡単な方法は、クラスを定義してselectステートメントでそれを使用することです。

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(); 
} 
関連する問題