Metode Ekstensi Agregat Tidak Didukung (Linq to Sql)

Saya mencoba menggunakan Metode Agregat di linq to Sql tetapi sepertinya tidak didukung.

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

untuk menggunakan Agregat, saya langsung mengkonversi buku ke IEnumerable sebagai berikut:

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

Dan ini berhasil. Saya ingin tahu apa kekurangan atau kekurangan desain jika saya menulis pertanyaan seperti ini.


person KrishnaDhungana    schedule 08.06.2013    source sumber
comment
tipe apa ctx.Books?   -  person BlackBear    schedule 08.06.2013
comment
Tergantung seberapa besar DB-nya.   -  person It'sNotALie.    schedule 08.06.2013
comment
@BlackBear Dalam database saya memiliki tabel bernama Buku   -  person KrishnaDhungana    schedule 08.06.2013


Jawaban (1)


dengan ctx.Books.AsEnumerable() Anda akan memilih seluruh tabel buku dari database dan mulai memprosesnya di memori. Ini bukan desain yang bagus. Yang harus Anda lakukan adalah memilih data yang Anda perlukan lalu memprosesnya secara lokal.

Misalnya

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
Apa yang lebih baik daripada solusi OP? Pada dasarnya Anda hanya menggunakan ToArray alih-alih AsEnumerable, yang menyebabkan semua buku dimuat ke memori sekaligus... - person Thomas Levesque; 08.06.2013
comment
@ThomasLevesque tidak. sampai komentar saya '// mungkin klausa beberapa tempat' akan diganti dengan tempat sebenarnya - person maxlego; 08.06.2013