实体框架中的自定义选择

时间:2014-01-18 19:15:45

标签: c# sql linq entity-framework

我正在使用C#和MS Sql Server R2。我有一个名为"Customer"的数据库表,这里是字段。

( CusId| FName | LName | Gender | Area | RegisterDate ).
-------------------------------------------------------

我创建了一个小型数据库应用程序,使用C#和Entity Framework。 我的Winform有一个datadridview。我想要做的是我想将数据表单Customer表绑定到该datagridview。但是当它绑定时,一些列数据应该根据条件进行转换,而一些数据只是转换。 datadridview列是

(ID,Title,Name,Area,Reg Date)
-----------------------------
  1. 绑定时,Name列应具有值 连接FName + LName

  2. 数据库列已将Gender存储为“M”和“F”。但是当它 绑定到datagirdview它应该成为“先生”和“太太”取决于 价值。

  3. 最后一件事是数据库列“RegisterDate”具有日期时间值。但 它应该转换为仅日期(yyyy-mm-dd)格式 datagridview的。
  4. 请告诉我如何使用Entity框架在C#中编写LINQ查询以正确检索数据。 帮我解决这个烂摊子。 :)

3 个答案:

答案 0 :(得分:0)

var result = from r in query
             select new {
                 ID = r.CustID,
                 Title = ?,
                 Name = r.Fname + " " + r.LName,
                 // ...
             };

答案 1 :(得分:0)

好吧,其中一个选项可以是创建与DataGridView布局匹配的DTO(数据传输对象)。

e.g。

    class CustomerDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string Area { get; set; }
        public string RegDate { get; set; }
    }

然后使用EF从数据库中获取数据并将其选择到您的DTO中。

类似的东西:

        var customerDtos = context.Customers.ToList().Select(c=> new CustomerDto
        {
            Id=c.ID, Area = c.Area, Name = c.FName + " " + c.LName, RegDate = c.Date.Format("yyyy-MM-dd"), Title = c.Gender == "M" ? "Mr" : "Ms"
        });

当然考虑添加分页支持等是个好主意,但这大概就是你需要的。 然后将结果绑定到DataGridView

        dataGridView1.DataSource = customerDtos;

答案 2 :(得分:0)

假设您有以下实体映射到您的数据库表:

class Customer
{
    public int CusId { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string Gender { get; set; }
    public string Area { get; set; }
    public DateTime RegisterDate { get; set; }
}

创建将绑定到网格的视图模型:

class CustomerModel
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Name { get; set; }
    public string Area { get; set; }
    public string RegDate { get; set; }
}

现在您可以使用一些映射库在这两个实体之间进行映射。我建议你使用AutoMapper(你可以从NuGet获得)。第一步是创建地图(通常在应用程序启动时添加此代码):

Mapper.CreateMap<Customer, CustomerModel>()
      .ForMember(cm => cm.ID, m => m.MapFrom(c => c.CusId))
      .AfterMap((c,cm) => {
            cm.Name = String.Format("{0} {1}", c.FName, c.LName);
            cm.Title = (c.Gender == "M") ? "Mr" : "Mrs";
            cm.RegDate = c.RegisterDate.ToString("yyyy-MM-dd");
      });

然后,您将能够将数据库实体映射到将在UI上显示的模型:

 var customers = db.Customers.ToList(); // get customers from database
 var models = Mapper.Map<List<CustomerModel>>(customers);
 // then bind your grid to models