2013-06-08 2 views
0

Я пытался использовать Aggregate Method в linq для Sql, но похоже, что он не поддерживается.Совокупный метод расширения не поддерживается (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()) 
      }); 

агрегировать, я сразу же конвертируется книги 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()) 
      }); 

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

+1

какой тип ctx.Books? – BlackBear

+0

Зависит от того, насколько велик БД. –

+0

@BlackBear В базе данных у меня есть таблица под названием Book – KrishnaDhungana

ответ

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()) 
}); 
+2

Как это лучше, чем решение OP? В основном вы просто используете ToArray вместо AsEnumerable, что заставляет сразу загружать все книги в память ... –

+0

@ThomasLevesque это не так. до моего комментария '// возможно, где где предложение' будет заменено фактическим, где – maxlego

+0

@maxlego Спасибо – KrishnaDhungana