LINQ IQueryable嵌套循环

时间:2019-06-25 14:10:47

标签: asp.net linq

我正在尝试将此循环复制为IQueryable:

        foreach (var book in BookList)
        {
            foreach (var a in book.Authors)
            {
                if (a.AuthorId.ToString() == Id)
                {
                    AuthorView = new AuthorViewModel(a, item.BookId);
                }
            }
        }

我尝试过:

var Test = _context.Book.Include(x => x.Authors)
  SelectMany(y => y.Authors).ToList().FirstOrDefault(x => x.AuthorId.ToString() == Id)
.Select(x => new AuthorViewModel(x, ??.BookId);

但是我在尝试创建对象AuthorViewModel时遇到了麻烦,因为它需要我无法访问的BookId。有没有办法将书ID传递下来?

对不起,只发布示例是没有道理的。

Books是数据库中的表。 Authors是数据库中包含许多作者的表。

Book:
BookId
Authors

Authors:
AuthorId
Name
DOB

AuthorList应该已经是BookList(列表)。我已经纠正了。

我试图根据作者ID定位作者-并将其返回到一个对象(作者,BookId(来自书表))

4 个答案:

答案 0 :(得分:1)

如果您深入查看“作者”(SelectMany),则您将无处可寻。 AuthorId上的条件需要在内部处理。

var Test = _context.Book.Include(x => x.Authors)
          .FirstOrDefault(x => x.Authors.Any(y => y.AuthorId.ToString() == Id))
          .Select(x => new AuthorviewModel(x,x.BookId);

当然,就像您的代码一样,每个作者只会选择一本书。我想知道您是否想要让所有书籍都代替...

答案 1 :(得分:1)

我认为您根本不需要SelectManyInclude。你可以去;

_context.Book
    .Where(b => b.Authors.Any(a => a.AuthorId.ToString() == Id))
    .Select(b => new AuthorViewModel(b.Authors.FirstOrDefault(x => x.AuthorId.ToString() == Id), b.BookId);

答案 2 :(得分:1)

这是我会做的:

var id= int.Parse(Id);
var Test = _context.Book.Include(x => x.Authors)
                        .SelectMany(item => item.Authors
                                                .Where(y => y.AuthorId == id)
                                                .Select(b => new AuthorViewModel(b,item.BookId));

您可以在SelectMany扩展方法内部进行过滤和投影

答案 3 :(得分:1)

首先,将if let disabled = model.sectionEnabled.map{!$0} { for vc in [vc1, vc2, vc3] { disabled.bind(to: vc.view.reactive.isHidden) } } 转换为数字,而不是尝试将Id转换为字符串。在表字段上应用任何类型的功能意味着覆盖该功能的索引将无法使用。您无需进行基于ID的快速搜索,而是进行全表扫描,该扫描可以在使用 string 语义进行比较之前将值转换为字符串。如果AuthorId参数包含任何前导零,则比较将失败。

对于LINQ查询本身,最简单的方法是使用查询表单。如果要为每本书和作者的组合返回一条记录,可以编写:

Id