2017-06-20 7 views
0

私は、映画、映画館をサーフしてチケットを購入または予約できるようにする映画アプリケーションに取り組んでいます。ユーザーがオンラインでチケットを予約した場合、同じプログラムを使用している販売者が12時間以内にチケットを有効にする必要があります。チケット情報をグリッドに表示し、編集可能にする必要があります。ここでは、クエリに含める必要があり、セールクラスとの関係が必要な私のデータベースクラスです。 (私は、TI関連のクラスが含ま売買クラスからオブジェクトを選択します:チケット、顧客、映画、ステータスやサロンに関する情報をDevExpress Grid Controlの編集可能なEF Selectクエリを作成するには?

販売クラス:

public class Sale 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [ForeignKey("CustomerId")] 
    public virtual Customer Customer { get; set; } 
    public int CustomerId { get; set; } 

    [ForeignKey("StatusId")] 
    public virtual Status Status { get; set; } 
    public int StatusId { get; set; } 

    public virtual Seller Seller { get; set; } 

    public DateTime SellDate { get; set; } 

    public double Price { get; set; } 

    [ForeignKey("TicketID")] 
    public virtual Ticket Ticket { get; set; } 
    public int TicketID { get; set; } 
} 

チケットクラス:

public class Ticket 
{ 
    public Ticket() 
    { 
     Seats = new List<Seat>(); 
    } 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [ForeignKey("MovieId")] 
    public virtual Movie Movie { get; set; } 
    public int MovieId { get; set; } 

    public virtual List<Seat> Seats { get; set; } 

    public virtual TimeSpan SeanceTime { get; set; } 

    public bool IsActive { get; set; } 

    public DateTime BuyDate { get; set; } 

    [ForeignKey("SaloonId")] 
    public virtual Saloon Saloon { get; set; } 
    public int? SaloonId { get; set; } 

    public string TicketNumber { get; set; } 
} 

顧客クラス:

public class Customer 
{ 
    public Customer() 
    { 
     Sales = new List<Sale>(); 
     CreditCards = new List<CreditCard>(); 
    } 
    [Key] 
    public int UserID { get; set; } 

    public virtual List<Sale> Sales { get; set; } 

    public virtual User User { get; set; } 

    [DataType(DataType.CreditCard)] 
    public virtual List<CreditCard> CreditCards { get; set; } 
} 

ユーザークラス:

public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public string Surname { get; set; } 
} 

ステータスクラス(チケットの情報を保持します。買っまたは予約)

public class Status 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public bool IsRez { get; set; } 

    public bool IsBuy { get; set; } 

    public bool IsCancel { get; set; } 

    public bool IsPaid { get; set; } 
} 

サロンクラス:。

public class Saloon 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public double salePrices { get; set; } 
} 

作品クラス:

public class Movie 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

私は選択のための匿名型を使用していますので、私の選択クエリで編集することはできません。 。私のクエリコード:

var Source = entities.Sales.Where(w => w.Ticket.Saloon.CinemaPlace.ID == seller.CinemaPlace.ID).Select(s => new 
     { 
      CustomerName = s.Customer.User.Name, 
      CustomerSurname = s.Customer.User.Surname, 
      SalePrice = s.Price, 
      s.Status.IsBuy, 
      s.Status.IsCancel, 
      s.Status.IsPaid, 
      s.Status.IsRez, 
      MovieName = s.Ticket.BuyDate, 
      s.Ticket.Movie.Name, 
      SaloonName = s.Ticket.Saloon.Name, 
      s.Ticket.SeanceTime, 
      s.Ticket.TicketNumber 
     }).ToList(); 

     RezervationsGrid.DataSource = Source3; 

しかし、グリッドで、件のデータを編集することができませんでした。それから、LinqをEntitiesクエリに使っているすべてのテーブルに参加しようとしましたが、どちらも役に立ちませんでした。グリッドの編集オプションを許可する関連オブジェクトからデータソースを作成する方法はありますか?ありがとう。

答えて

0

匿名型(Selectメソッドで新しい演算子を使用して宣言できる匿名型)は、.NETで書き込み可能なプロパティを持つことはできません。そのため、グリッドは編集できません。インプレース編集を利用するには、実際のCLRタイプのオブジェクトをインスタンス化する必要があります。

このために、object initializerを使用してSelectメソッドの値を設定するpublicプロパティを持つ特別なViewModelクラスを宣言できます。

.Select(s => new SaleViewModel() { 
    CustomerName = s.Customer.User.Name, 
    SalePrice = Price 
}) 

あなたはこのようにそれを使用するためのViewModelコンストラクタにプロパティの初期化ロジックを移動しないように注意してください:

.Select(s => new SaleViewModel(s)) 

オブジェクト初期化子は、Entity Frameworkのは、SQLに変換することができます式ツリー、ありますクエリ。コンストラクタは単なるメソッド参照であるため、Entity Frameworkはそのような式を拒否します。この方法を使用する場合は、選択の前にToListメソッドを呼び出す必要があります。

SaleViewModelには、変更を保存するためのDbContextクラスを受け入れるメソッドを含めることができます。

また、セールインスタンスを選択し、列のフィールド名( "Customer.User.Name"など)で複雑なプロパティパスを使用することもできます。これはおそらく、特定のビューモデルに固有のモデルを見つけたり、変更されたプロパティ値をコピーする必要がないため、保存ロジックを単純化するのに役立ちます。

関連する問題