如何为 DevExpress 网格控件制作可编辑的 EF Select 查询?

How To Make An Editable EF Select Query for DevExpress Grid Control?

我正在开发一个电影院应用程序,该应用程序允许用户浏览电影、电影院地点并允许他们购买或预订门票。如果用户在线预订了机票,则该机票必须在 12 小时内由也使用相同程序的卖家激活。我需要在网格上显示票证信息并且需要制作 editable。这是我的数据库 classes,它必须包含在查询中并且与 Sale class 有关系。 (我想 select 来自 Sale class 的对象,其中包括 ti 的相关 classes:门票、客户、电影、状态和沙龙信息。

促销 Class:

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; }
}

工单Class:

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; }
}

客户Class:

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; }
}

用户Class:

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

    public string Name { get; set; }

    public string Surname { get; set; }
}

状态Class(持有门票信息。购买或保留。)

  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; }
}

沙龙Class:

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

    public string Name { get; set; }

    public double salePrices { get; set; }
}

电影 Class:

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

    public string Name { get; set; }
}

我无法编辑,因为在我的 select 查询中,我对 selection 使用匿名类型。我的查询代码:

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 to Entities 查询加入每个 table,但它也没有帮助。有没有办法从我的相关对象创建一个数据源,允许在网格中编辑选项?谢谢。

匿名类型(可以通过 Select 方法中的 new 运算符声明的类型)在 .NET 中不能具有可写属性。这就是网格不可编辑的原因。要利用就地编辑,您需要实例化真正的 CLR 类型的对象。

为此,您可以声明一个具有 public 属性的特殊 ViewModel class,您应该使用 object initializer.[=13] 在 Select 方法中填充值=]

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

请注意,您不应将 属性 初始化逻辑移动到 ViewModel 构造函数以这样使用它:

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

对象初始化器是表达式树,Entity Framework 可以转化为 SQL 查询。构造函数只是一个方法引用,所以 Entity Framework 会拒绝这样的表达式。如果您想使用这种方法,则需要在 Select.

之前调用 ToList 方法

SaleViewModel 可以使用接受 DbContext class 的方法来保存更改。

您还可以 select Sale 实例并在列的字段名称中使用复杂的 属性 路径(例如 "Customer.User.Name")。这可能会帮助您简化保存逻辑,因为您不需要找到特定于特定视图模型的模型并复制修改后的 属性 值。