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

本文关键字:变量 将来 存储 语句 foreach 执行 LINQ 结果 | 更新日期: 2023-09-27 18:13:53

我需要将满足特定条件的多个值存储到lstfile中。为此,我声明:

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

并使用下面的代码来获取刚刚安装的记录的id在T_SelectionListDetails:

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

如何获得完整的结果?

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

您应该使用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);
} 

你在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);
 }  

我想你想要的是一次传递所有的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();