2017-05-30 7 views
0

私のMVC5アプリケーションコントローラでループを行い、すべてのタイムラインポストを取得しようとしています。画像がポストにアップロードされている場合は画像が表示されます。画像が存在する3つのテーブルを結合する

以下のコードはすべて投稿と画像を取得しますが、3枚の画像をアップロードして同じ投稿を3回繰り返してもループバックされます。

これは正しい方法ではありませんか?

var query = (from i in db.Timeline 

     join u in db.Users on i.UserId equals u.Id 

     join f in db.UserFiles on i.Id equals f.TimelineId into ps 
     from f in ps.DefaultIfEmpty() 

     orderby i.PostDate descending 
     select new { i.Id, i.UserId, i.Post, i.PostDate, u.FirstName, u.ProfilePic, FileName = f == null ? "No image(s)" : f.FileName + "_thumb." + f.FileExtension }).ToList(); 

List<TimelineLoop> cModel = new List<TimelineLoop>(); 

foreach (var item in query) 
{ 
    cModel.Add(new TimelineLoop 
    { 
     Id = item.Id, 
     UserId = item.UserId, 
     Post = item.Post, 
     PostDate = item.PostDate, 
     Name = item.FirstName, 
     ProfilePic = item.ProfilePic, 

     FileName = item.FileName 

    }); 
} 
return cModel; 
+0

その後、あなただけのグループごとに一度画像をアップロードする必要があります。 – jdweng

答えて

0
  1. 私はあなたのクエリのこの特定の部分を見れば、それが生成します:

    from i in db.Timeline 
    join u in db.Users on i.UserId equals u.Id 
    

    timelinePost1を| user1

    timelinePost2 | user1

    timelinePost3 | user2

    => 1人のユーザーがタイムラインの投稿を複数持つことができます。

  2. の結果は、UserFilesに結合されます。私は、1つのタイムラインポストが多くの写真を持つことができると仮定します。

    join f in db.UserFiles on i.Id equals f.TimelineId into ps 
    from f in ps.DefaultIfEmpty() 
    

    それが生成する:あなたは、同じポストに3枚の画像をアップロードした場合、あなたはこのような何かを期待する

    timelinePost1 |ユーザー1 |写真1

    timelinePost1 |ユーザー1 |写真2

    timelinePost1 |ユーザー1 |写真3

    timelinePost2 |ユーザー1 |

    timelinePost3 |ユーザー2 |

出力にこのパターンがありますか?

EDIT:

あなたの結果にポストにつき1つのオブジェクトを持つようにしたい場合は、あなたが以下の照会に類似して行うことができ、辞書にqueryリストを変換する必要があるかもしれません。

 List<MyObject> list = ...; 
     var map = list 
    .GroupBy(x => x.KeyedProperty) 
     .ToDictionary(x => x.Key, x => x.ToList()); 

参考:ファイル名をGROUPBY場合LINQ - Convert List to Dictionary with Value as List

+0

はい、このパターンが出力に表示されます。 – Katey

+0

私は自分の答えを編集しました。繰り返しなくても、1ポストのすべての画像を取得する方法の詳細を確認できます。私はこれがあなたが探しているものだと願っています – grepLines

関連する問題