如何为 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")。这可能会帮助您简化保存逻辑,因为您不需要找到特定于特定视图模型的模型并复制修改后的 属性 值。
我正在开发一个电影院应用程序,该应用程序允许用户浏览电影、电影院地点并允许他们购买或预订门票。如果用户在线预订了机票,则该机票必须在 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")。这可能会帮助您简化保存逻辑,因为您不需要找到特定于特定视图模型的模型并复制修改后的 属性 值。