LINQ左联接的问题

        我从查询表达式转成查询操作符的写法,但是结果总是不对

        //查询表达式
        GridViewLeftOuterJoin.DataSource =
          from publisher in SampleData.Publishers
          join book in SampleData.Books on publisher equals book.Publisher into publisherBooks
          from book in publisherBooks.DefaultIfEmpty ()
          select new {
              Publisher = publisher.Name ,
              Book = book == default ( Book ) ? "(no books)" : book.Title
          };
        GridViewLeftOuterJoin.DataBind ();
         正确结果:
            //Publisher      Book
            //FunBooks       Funny Stories
            //FunBooks       Bonjour mon Amour
            //Joe Publishing LINQ rules
            //Joe Publishing C# on Rails
            //Joe Publishing All your base are belong to us
            //I Publisher    (no books)

       

        //查询操作符
        GridViewLeftOuterJoin1.DataSource = SampleData.Publishers
                                            .Join ( SampleData.Books ,
                                                        p => p ,
                                                        b => b.Publisher ,
                                                        ( b , pb ) => new {
                                                            Publisher = b.Name ,
                                                            Book = pb == default ( Book ) ? "(no books)" : pb.Title
                                                        } ).DefaultIfEmpty ();

        GridViewLeftOuterJoin1.DataBind ();
         结果(错误):
            //Publisher      Book
            //FunBooks       Funny Stories
            //FunBooks       Bonjour mon Amour
            //Joe Publishing LINQ rules
            //Joe Publishing C# on Rails
            //Joe Publishing All your base are belong to us


以下为数据源:
 static public class SampleData
  {
    static public Publisher[] Publishers =
    {
      new Publisher {Name="FunBooks"},
      new Publisher {Name="Joe Publishing"},
      new Publisher {Name="I Publisher"}
    };
    static public Book[] Books =
    {
      new Book {
        Title="Funny Stories",
        Publisher=Publishers[0],
        Authors=new[]{Authors[0], Authors[1]},
        PageCount=101,
        Price=25.55M,
        PublicationDate=new DateTime(2004, 11, 10),
        Isbn="0-000-77777-2",
        Subject=Subjects[0]
      },
      new Book {
        Title="LINQ rules",
        Publisher=Publishers[1],
        Authors=new[]{Authors[2]},
        PageCount=300,
        Price=12M,
        PublicationDate=new DateTime(2007, 9, 2),
        Isbn="0-111-77777-2",
        Subject=Subjects[0]
      },
      new Book {
        Title="C# on Rails",
        Publisher=Publishers[1],
        Authors=new[]{Authors[2]},
        PageCount=256,
        Price=35.5M,
        PublicationDate=new DateTime(2007, 4, 1),
        Isbn="0-222-77777-2",
        Subject=Subjects[0]
      },
      new Book {
        Title="All your base are belong to us",
        Publisher=Publishers[1],
        Authors=new[]{Authors[3]},
        PageCount=1205,
        Price=35.5M,
        PublicationDate=new DateTime(2006, 5, 5),
        Isbn="0-333-77777-2",
        Subject=Subjects[2]
      },
      new Book {
        Title="Bonjour mon Amour",
        Publisher=Publishers[0],
        Authors=new[]{Authors[1], Authors[0]},
        PageCount=50,
        Price=29M,
        PublicationDate=new DateTime(1973, 2, 18),
        Isbn="2-444-77777-2",
        Subject=Subjects[1]
      }
    };
  }

ibeautiful
浏览 309回答 1
1回答

慕莱坞森

   GridViewLeftOuterJoin1.DataSource = SampleData.Publishers         .GroupJoin ( SampleData.Books , p => p , b => b.Publisher ,                         ( b , pb ) => new { b , pb } )         .SelectMany ( pb => pb.pb.DefaultIfEmpty () ,                         ( b , pb ) => new {                          Publisher = b.b.Name ,                           Book = pb == default ( Book )                                       ? "(no books)" : pb.Title          } );        GridViewLeftOuterJoin1.DataBind ();
打开App,查看更多内容
随时随地看视频慕课网APP