如何将foreach中执行的LINQ语句的结果存储到变量中以备将来使用?

时间:2015-09-21 06:48:41

标签: c# asp.net-mvc linq

我需要将满足特定条件的多个值存储到lstfile。 为此我宣布:

List<AlbumPhotos> lstfile =  new List<AlbumPhotos>();

使用以下代码获取T_SelectionListDetails中刚刚安装的记录的id:

idList = (from s in context.T_SelectionListDetails
                          orderby s.ID descending
                          select new AlbumPhotos { ID= s.ID }).Take(i).ToList();

其中i是保存现在保存了多少记录的变量。然后我需要将T_SelectionListDetails表与T_UserAlbumDetails一起使用。以下代码用于此并且它将返回多个结果但我无法获得整个结果但只有一个。

foreach(var item in idList)
{
    lstfile = (from s in context.T_SelectionListDetails
               join p in context.T_UserAlbumDetails on s.UserAlbumDetails_ID equals p.ID
               where s.ID == item.ID
               select new AlbumPhotos
                       {
                           virtualPath = p.VirtualPath,
                           ID = s.ID
                       }).ToList();
           // lstfile.Add(t);
     }  

我怎样才能获得完整的结果?

3 个答案:

答案 0 :(得分:2)

您应该使用AddRange将一个集合的元素添加到另一个列表的末尾。

foreach(var item in idList)
{
    var lstfile1 = (from s in context.T_SelectionListDetails
               join p in context.T_UserAlbumDetails on s.UserAlbumDetails_ID equals p.ID
               where s.ID == item.ID
               select new AlbumPhotos
                       {
                           virtualPath = p.VirtualPath,
                           ID = s.ID
                       }).ToList();
      lstfile.AddRange(lstfile1);
} 

答案 1 :(得分:0)

您正在foreach循环中分配lstfile,它将替换每次新迭代中的旧值。在循环之后,它将包含在foreach循环的最后一次迭代中分配的值。

最好更新代码:

foreach(var item in idList)
{
var lstRows = (from s in context.T_SelectionListDetails
           join p in context.T_UserAlbumDetails on s.UserAlbumDetails_ID equals p.ID
           where s.ID == item.ID
           select new AlbumPhotos
                   {
                       virtualPath = p.VirtualPath,
                       ID = s.ID
                   }).ToList();
       lstfile.AddRange(lstRows);
 }  

答案 2 :(得分:0)

我认为你要找的是立刻传递所有ID而不是循环遍历它。

           lstfile = (from s in context.T_SelectionListDetails
                      .Where(c => idList.Select(n => n.ID)
                      .Contains(c.ID))
                      join p in context.T_UserAlbumDetails on   
                      s.UserAlbumDetails_ID  equals p.ID

                      select new AlbumPhotos
                      {
                        virtualPath = p.VirtualPath,
                        ID = s.ID
                      }).ToList();