ไม่รองรับวิธีการขยายแบบรวม (Linq to Sql)

ฉันพยายามใช้วิธีรวมใน linq ถึง 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
ขึ้นอยู่กับว่า DB มีขนาดใหญ่แค่ไหน   -  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
มันดีกว่าโซลูชันของ OP อย่างไร โดยพื้นฐานแล้วคุณเพียงใช้ ToArray แทน AsEnumerable ซึ่งทำให้หนังสือทั้งหมดโหลดในหน่วยความจำพร้อมกัน... - person Thomas Levesque; 08.06.2013
comment
@ThomasLevesque มันไม่ใช่ จนกว่าความคิดเห็นของฉัน '// อาจจะบางส่วนที่ clause' จะถูกแทนที่ด้วยสถานที่จริง - person maxlego; 08.06.2013