C# 按索引从IQueryable列表中获取元素
我有这样的表达:C# 按索引从IQueryable列表中获取元素,c#,entity-framework,linq,C#,Entity Framework,Linq,我有这样的表达: var query = from inventar in _context.Inventar join inventarsoba in _context.InventarSoba.Where(x => x.SobaId == request.SobaId) on inventar.InventarId equals inventarsoba.InventarId
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;
谢谢大家,用foreach而不是foreach做了这个把戏 然而,有人建议我只需在一次迭代中完成,并在最后添加到列表中,这就像一个符咒,下面是我最终的做法:
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;
}
它不是用来编制索引的。您希望在查询{…}中使用foreach var obj2,但使用循环变量的描述性名称而不是obj2.Add.ToList来创建项目列表。然后,您就有了完整的列表,可以通过索引访问元素。在LINQ to SQL中,它没有被转换,谢谢,当我刚刚使用foreach语句时,它起作用了。您正在迭代两次。为什么不将查询与InventarModel的创建结合起来,这样它将迭代一次呢?一些解释会很好。只有代码的答案对未来的读者没有什么价值。
public class InventarModel
{
public int InventarId { get; set; }
public string Naziv { get; set; }
public int SobaId { get; set; }
public int InventarSobaId { get; set; }
}
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();
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;
}