实现所有可查询对象

时间:2017-03-23 14:08:27

标签: c# linq linq-to-entities entity

有没有办法实现我使用LINQ获得的所有可查询对象?

假设我想根据一些标准获取作者列表及其书籍列表(这是一个示例查询,我希望不需要一些实际的类):

var authorData = from a in ctx.Authors
                where a.Age > 30
                select new // anon class
                {
                    Name = a.Name,
                    City = a.Address.City,
                    Books = from b in ctx.Books
                            where b.Price > 10
                            && b.AuthorId == a.Id
                            select new // anon class
                            {
                                Name = b.Name,
                                Price = b.Price,
                            }
                };

现在我想迭代作者authorData并做一些工作,让我们说打印书数。 Books列表的类型为IQueryable,为每个作者获取这些对象将产生一个我想要避免的DB的新查询。

foreach(var author in authorData.ToList())
{
    Console.WriteLine(author.Books.Count());
}

如何避免每个作者的新SQL查询?有没有办法让Book anonymous类对象与Author匿名类同时实现?

修改 最终目标是尽可能少地读取数据库,但拥有所有AuthorBook个对象。在每个foreach循环迭代中实现书籍似乎很糟糕。

我甚至会接受一个答案,将Book对象放在一个单独的集合中,比如Dictionary或者使Author / Book连接方便的东西,但不需要很多DB读取

2 个答案:

答案 0 :(得分:0)

您可以对书籍查询和外部查询使用ToList()方法。

var authorData = (from a in ctx.Authors
        where a.Age > 30
        select new // anon class
        {
            Name = a.Name,
            City = a.Address.City,
            Books = (from b in ctx.Books
                    where b.Price > 10
                    && b.AuthorId == a.Id
                    select new // anon class
                    {
                        Name = b.Name,
                        Price = b.Price,
                    }).ToList()
        }).ToList();
foreach(var author in authorData)
   {
     Console.WriteLine(author.Books.Count());
   }

答案 1 :(得分:-2)

var authorData = (from a in ctx.Authors
            where a.Age > 30
            select new // anon class
            {
                Name = a.Name,
                City = a.Address.City,
                Books = from b in ctx.Books
                        where b.Price > 10
                        && b.AuthorId == a.Id
                        select new // anon class
                        {
                            Name = b.Name,
                            Price = b.Price,
                        }
            }).ToList();