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

时间:2017-06-20 21:03:34

标签: entity-framework devexpress gridcontrol

我正在开发一个电影应用程序,允许用户浏览电影,电影院,并允许他们购买或预订门票。如果用户在线预订了机票,则必须在12小时内由同样使用相同程序的卖方激活该机票。我需要在网格上显示故障单信息,并且需要进行编辑。这是我的数据库类,必须包含在查询中并与Sale类有关系。 (我想从Sale类中选择包含ti相关类的对象:票,客户,电影,状态和轿车信息。

销售类:

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

Saloon Class:

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

1 个答案:

答案 0 :(得分:0)

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

为此,您可以使用公共属性声明一个特殊的ViewModel类,您应该使用object initializer在Select方法中填充值。

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

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

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

对象初始化器是表达式树,实体框架可以将其转换为SQL查询。构造函数只是一个方法引用,因此Entity Framework将拒绝这样的表达式。如果您想使用此方法,则需要在Select。之前调用ToList方法。

SaleViewModel可以让方法接受DbContext类来保存更改。

您还可以选择Sale实例并在列中使用复杂的属性路径。字段名称(例如&#34; Customer.User.Name&#34;)。这可能有助于您简化保存逻辑,因为您不需要查找特定于某个视图模型的模型并复制已修改的属性值。