2016-04-26 14 views
1
public class JoinModel 
{ 
     public Book Book { get; set; } 
     public BookOrder BookOrder { get; set; } 
} 

public class Book 
{ 
     public int BookID { get; set; } 
     public string UniqueID{ get; set; } 
     public int Year { get; set; } 
     public int BookNumber { get; set; } 
     public int Value { get; set; } 

} 

public class BookOrder 
{ 
     public int BookOrderID { get; set; } 
     public string UniqueID{ get; set; } 
     public int Year { get; set; } 
     public int BookNumber { get; set; } 
     public DateTime OrderDate { get; set; } 
} 

Versuchen, einen Lambda-Ausdruck zu schreiben, der eine linke Join und eine Liste zurückgeben wird. Die Liste sollte Bücher enthalten, aber BookOrder kann null sein.Linq linken Join Lambda-Ausdruck und Ergebnis zu einer Liste

Ich habe folgendes versucht, die Build-Fehler führt:

kann nicht implizit Typ umwandeln ‚System.Collections.Generic.IEnumerable < ... BookOrder> zu ..BookOrder Eine explizite Konvertierung vorhanden ist (sind Sie fehlt eine Besetzung?) auf der Linie 5 (rot squigles auf BKO)

ich bin nicht in der Lage Klassen Buch oder BookOrder zu ändern, da dies eine dritte Partei, also muss ich Sie auf die nachfolgenden drei Bedingungen beitreten aufgelistet .

List<JoinModel> lstJoinModel = new List<JoinModel>(); 

Line 1 - lstJoinModel = Context.Books 
Line 2 - .GroupJoin(Context.BookOrder, 
Line 3 - bk => new {  bk.UniqueID, bk.Year, bk.PostingId }, 
Line 4 - bko => new {  bko.UniqueID, bko.Year, bko.BookNumber }, 
Line 5 - (bk, bko) => new  JoinModel { Book = bk, BookOrder = bko }) 
Line 6 - .Where(r => r.Book.Value >  0).ToList(); 
+0

Können Sie 'JoinModel' ändern? – juharr

Antwort

1

Hier ist Ihre Linq:

List<JoinModel> lstJoinModel = (from bk in Context.Books 
           join bko in Context.BookOrder on new { bk.UniqueID, bk.Year, bk.BookNumber } equals new { bko.UniqueID, bko.Year, bko.BookNumber } 
           into bd 
           from bd2 in bd.DefaultIfEmpty() 
           where bk.Value > 0 
           select new JoinModel { Book = bk, BookOrder = bd2 } 
           ).ToList(); 

Und hier gehen Sie mit Ihrem Lambda-Ausdruck Version

List<JoinModel> lstJoinModel = Context.Books.GroupJoin(Context.BookOrder, 
           bk => new { bk.UniqueID, bk.Year, bk.BookNumber }, 
           bko => new { bko.UniqueID, bko.Year, bko.BookNumber }, 
           (x, y) => new { Book = x, BookOrder = y }) 
           .SelectMany(x => x.BookOrder.DefaultIfEmpty(), 
           (x, y) => new JoinModel 
           { 
            Book = x.Book, 
            BookOrder = y 
           }) 
           .Where(r => r.Book.Value > 0).ToList();