Совокупный метод расширения не поддерживается (Linq to Sql)

Я пытался использовать Aggregate Method в linq to Sql, но похоже, что он не поддерживается.

LibrarySystemDataContext ctx = new LibrarySystemDataContext();

var query = ctx.Books
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          .Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString())
          });

чтобы использовать Aggregate, я сразу преобразовал книги в IEnumerable следующим образом:

var query = ctx.Books.AsEnumerable()
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          .Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString())
          });

И это работает. Я хочу знать, какие будут недостатки или недостатки дизайна, если я напишу такие запросы.


person KrishnaDhungana    schedule 08.06.2013    source источник
comment
какой тип ctx.Books?   -  person BlackBear    schedule 08.06.2013
comment
Зависит от размера БД.   -  person It'sNotALie.    schedule 08.06.2013
comment
@BlackBear В базе данных у меня есть таблица под названием Book   -  person KrishnaDhungana    schedule 08.06.2013


Ответы (1)


с помощью ctx.Books.AsEnumerable() вы выберете всю таблицу книг из базы данных и начнете ее обработку в памяти. Это не хороший дизайн. Что вам нужно сделать, так это выбрать нужные данные, а затем обработать их локально.

Например

var temp = ctx.Books
  // probably some where clause
  .Select(x => new
      {
        BookID = x.BookID,
          BookName = x.Title,
          Authors = x.AuthorBooks.Select(a => a.Author)
          })
  .ToArray();

var books = temp.Select(x => new { 
    x.BookID, 
    x.BookName, 
    Authors = x.Authors.Aggregate(new StringBuilder(), (sb, r) => sb.Append(r.FirstName + " " + r.LastName +"& "), sb => sb.ToString()) 
});
person maxlego    schedule 08.06.2013
comment
Чем это лучше, чем решение ОП? По сути, вы просто используете ToArray вместо AsEnumerable, что приводит к одновременной загрузке всех книг в память... - person Thomas Levesque; 08.06.2013
comment
@ThomasLevesque это не так. до тех пор, пока мой комментарий '//, вероятно, некоторое предложение where' не будет заменен фактическим предложением where - person maxlego; 08.06.2013