查询语法以获取不同类型的列表?

时间:2019-06-30 14:24:14

标签: linq

我有一个获取书籍的查询,我是LINQ的新手,所以我不知道语法:

var books = (from book in db.Books
             join borrow in db.Borrows on book equals borrow.Book
             select new BookDTO { Title = book.Title, 
                                  Borrows = book.Borrows.ToList() }).ToList(); // book.Borrows.ToList() <- use dto's instead

如何选择Book.Borrows作为对象列表(BorrowDTO的对象)?是否有类似Borrows = new List<BorrowDTO>(book.Borrows)

的内容

2 个答案:

答案 0 :(得分:1)

您可以使用.Select()将列表投影为其他类型。所以代替这个:

Borrows = book.Borrows.ToList()

您会有类似这样的内容:

Borrows = book.Borrows.Select(b => new BorrowDTO { /* properties here */ }).ToList()

请注意,根据您的数据源,可能会有 更有效的方法来选择数据。如果直接从LINQ To Entities中拉出,则可能会在尝试在数据库中物化查询中无法实现的类型或无法翻译的其他任何操作时遇到问题进入SQL。在没有特定目的的情况下进行一系列.ToList()操作也是不必要的。

但是,在这一点上,这全是理论上的。根据显示的代码和LINQ语法本身,您可以从列表中进行选择。 (当然,我建议使用扩展方法语法而不是您当前使用的查询语法。当然,个人喜好,但我发现构建这样的嵌套操作更容易,更直观。尽管您也可以使用{我可以想象from ... select ...之后的{1}}语法。)

答案 1 :(得分:0)

u = df.melt('id') u.assign(variable=u.groupby('id').cumcount()).pivot(*u) variable 0 1 2 3 id 0 A B NaN NaN 1 C E D F 2 G H NaN NaN 而不是创建新的时间对象。

该查询将返回 [Route("test/{str}")] public async Task<IActionResult> test(string str) { return Content(str); } 类型的select book.Borrows;然后您就可以对其进行迭代并将其转换为列表