【问题标题】:Get an element from IQueryable<anonymous> list by index通过索引从 IQueryable<anonymous> 列表中获取元素
【发布时间】:2019-09-30 13:45:26
【问题描述】:

我有这样的表达方式:

var query = from inventar in _context.Inventar
                        join inventarsoba in _context.InventarSoba.Where(x => x.SobaId == request.SobaId)
                        on inventar.InventarId equals inventarsoba.InventarId
                        select new { inventar, inventarsoba.InventarSobaId };

这基本上让我得到了所有“Inventar”记录的列表,其 id 也位于“InventarSoba”表中。最终结果是一个匿名类型列表,其中包含一个“Inventar”类型对象和一个 InventarSobaId 整数,都在一个元素中。

我基本上是在尝试将所有这些存储在一个名为 InventarModel 的类中,该类具有我想要发回的 InventarSobaId 和 Inventar 字段。但是,当我运行此代码时:

 List<InventarModel> Lista = new List<InventarModel>();

    if (query.Count() > 0)
    {
        InventarModel obj;
        for (int i = 0; i < query.Count(); i++)
        {
            var obj2 = query.ElementAt(i);

            obj = new InventarModel
            {
                InventarId = obj2.inventar.InventarId,
                Naziv = obj2.inventar.Naziv,
                SobaId = request.SobaId,
                InventarSobaId = obj2.InventarSobaId
            };
            Lista.Add(obj);
        }
    }
    return Lista;

它说不支持 ElementAt(i),它无法使用 ElementAt 方法解析值,并且尝试使用 [] 对其进行索引根本不起作用。请注意,当我使用“First”函数时,它工作正常,“obj”变量正确获取第一行的数据,但我无法使其与索引一起使用。 p>

简单地说,我正在尝试从查询中获取数据并将其全部存储在一个类中,该类将有一个 List,但我不知道该怎么做。

以防万一,Inventar 和 InventarModel 类如下所示:

发明者

   public partial class Inventar
    {
        public Inventar()
        {
            InventarSoba = new HashSet<InventarSoba>();
        }

        public int InventarId { get; set; }
        public string Naziv { get; set; }

        public virtual ICollection<InventarSoba> InventarSoba { get; set; }
    }

InventarModel

public class InventarModel
{
    public int InventarId { get; set; }
    public string Naziv { get; set; }
    public int SobaId { get; set; }
    public int InventarSobaId { get; set; }
}

【问题讨论】:

  • 它不适用于索引。您想要foreach (var obj2 in query) {...}——但使用循环变量的描述性名称而不是obj2
  • 添加 .ToList() 以创建项目列表。然后你就有了完整的列表,并且可以通过索引访问元素。
  • 在 LINQ to SQL 中未翻译 (stackoverflow.com/questions/5147767/…)
  • 谢谢,当我使用 foreach 语句时它工作了
  • 您正在迭代两次。为什么不将查询与 InventarModel 的创建结合起来,让它迭代一次?

标签: c# entity-framework linq


【解决方案1】:
 List<InventarModel> Lista = 
         (from inventar in _context.Inventar
          join inventarsoba in _context.InventarSoba.Where(x => x.SobaId == request.SobaId)
          on inventar.InventarId equals inventarsoba.InventarId
          select new InventarModel()
          {
             //Assign values here from the inventarsoba and inventar
             InventarId = inventar.InventarId,
             Naziv = inventar.Naziv,
             SobaId = request.SobaId,
             InventarSobaId = inventarsoba.InventarSobaId
          }).ToList();

【讨论】:

  • 一些解释会很好。纯代码答案对未来的读者没有什么价值。
【解决方案2】:

谢谢大家,用 foreach 代替 for 成功了。

但是,有人建议我只做一次迭代,然后在最后添加到列表,这就像一个魅力,这是我最后的做法:

public override List<InventarModel> Get(InventarSearchRequest request)
{

    var query = (from inventar in _context.Inventar
                 join inventarsoba in _context.InventarSoba.Where(x => x.SobaId == request.SobaId)
                 on inventar.InventarId equals inventarsoba.InventarId
                 select new InventarModel()
                 {
                     InventarId = inventar.InventarId,
                     Naziv = inventar.Naziv,
                     SobaId = request.SobaId,
                     InventarSobaId = inventarsoba.InventarSobaId
                 }).ToList();

    return query;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多