1

linq エンティティをドメイン オブジェクトに適合させる次のコードがあります。

return from g in DBContext.Gigs
               select new DO.Gig
               {
                   ID = g.ID,
                   Name = g.Name,
                   Description  = g.Description,
                   StartDate    = g.Date,
                   EndDate      = g.EndDate,
                   IsDeleted    = g.IsDeleted,
                   Created      = g.Created,
                   TicketPrice  = g.TicketPrice

               };

これは非常にうまく機能します。

ただし、ドメイン オブジェクト Venue オブジェクトを設定し、同じステートメントでギグに追加したいと考えています。これが私の試みです....

return from g in DBContext.Gigs
               join venue in DBContext.Venues on g.VenueID equals venue.ID
               select new DO.Gig
               {
                   ID = g.ID,
                   Name = g.Name,
                   Description  = g.Description,
                   StartDate    = g.Date,
                   EndDate      = g.EndDate,
                   IsDeleted    = g.IsDeleted,
                   Created      = g.Created,
                   TicketPrice  = g.TicketPrice,
                   Venue        =     from v in DBContext.Venues
                                        where v.ID == g.VenueID
                                        select new DO.Venue
                                        {
                                            ID           = v.ID,
                                            Name         = v.Name,
                                            Address      = v.Address,
                                            Telephone    = v.Telephone,
                                            URL          = v.Website 
                                        }

               };

ただし、これはコンパイルされません!!!

「select new」アプローチを使用して子オブジェクトを適応させることは可能ですか?

私は何をしているのでしょうか?

4

2 に答える 2

2

内部 LINQ クエリは、1 つだけでなく複数のオブジェクトを返します。次のような呼び出しでラップします。

Venue = (from v in DBContext.Venues
         where v.ID == g.VenueID
         select new DO.Venue
         {
             ID           = v.ID,
             Name         = v.Name,
             Address      = v.Address,
             Telephone    = v.Telephone,
             URL          = v.Website 
         }).SingleOrDefault()

Single() 対 SingleOrDefault() 対 First() 対 FirstOrDefault() の選択は、クエリの種類によって異なりますが、最初の 2 つのいずれかが必要だと思います。("OrDefault" バリアントは、クエリにデータがない場合は null を返し、他のバリアントはスローします。)

また、単一の関係が関係している場合、結合はあなたが望んでいたものとより一致する可能性があるというマイクに同意します.

于 2008-12-14T19:00:45.767 に答える
1

なぜ結合とサブ選択を行っているのですか? 参加の結果を使用して、新しい会場を作成できます。ギグと会場が1対1の関係にないと、トラブルが発生する可能性があることに注意してください。

これを試して:

return from g in DBContext.Gigs 
    join venue in DBContext.Venues on g.VenueID equals venue.ID 
    select new DO.Gig { ID = g.ID, Name = g.Name, Description = g.Description,
        StartDate = g.Date, EndDate = g.EndDate, IsDeleted = g.IsDeleted, 
        Created = g.Created, TicketPrice = g.TicketPrice, 
        Venue = new DO.Venue { ID = venue.ID, Name = venue.Name, 
            Address = venue.Address, Telephone = v.Telephone, 
            URL = v.Website }
于 2008-12-14T16:53:07.820 に答える