2014-01-18 4 views
0

C# 및 MS Sql Server R2를 사용하고 있습니다. 나는 "Customer"라고 불리는 데이터베이스 테이블을 가지고 있으며 여기에 필드가 있습니다.Entity Framework에서 사용자 지정 선택

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

저는 작은 데이터베이스 응용 프로그램 인 C# 및 Entity Framework를 만들었습니다. 내 Winform에 datadridview가 있습니다. 내가 뭘하고 싶은 건 데이터 양식 고객 테이블을 그 DataGridview에 바인딩하고 싶다. 그러나 바인딩 할 때 일부 열 데이터는 조건에 따라 변환되어야하며 일부 데이터는 변환 만해야합니다. 이 데이터베이스 열은 'M'와 'F'와 성별을 저장 한

  • 값 연결된 FNAME + LNAME 있어야 이름 열 결합되면 datadridview 열은

    1. (ID,Title,Name,Area,Reg Date) 
      ----------------------------- 
      
      있다 . 그러나 datagirdview에 바인딩하면 값에 따라 "Mr"과 "Mrs"가되어야합니다.

    2. 마지막 항목은 데이터베이스 열입니다. "RegisterDate"에는 datetime 값이 있습니다. 그러나 datagridview에서는 날짜 만 (yyyy-mm-dd) 형식으로 변환됩니다.

    데이터를 올바르게 검색하기 위해 C#에서 Entity 프레임 워크를 사용하여 LINQ 쿼리를 작성하는 방법을 알려주십시오. 이 혼란을 해결하도록 도와주세요. :)

  • 답변

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

    글쎄, 옵션 중 하나는 DataGridView 레이아웃과 일치하는 DTO (데이터 전송 개체)를 만드는 것일 수 있습니다.

    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; 
    
    +0

    감사를 :

    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에 표시됩니다 모델 데이터베이스 개체를 매핑 할 수 있습니다 : 첫 번째 단계는지도를 만들고있다 (일반적으로이 코드는 응용 프로그램의 시작에 추가) 제비. 나는 시도 할 것이다. – user2965164

    +0

    정말 고마워. U는 내 시간을 절약했다. 그것은 효과가 있었다. – user2965164

    +0

    문제 없습니다. 도움이 되니 기쁩니다. 문제가 해결되면 대답 중 하나를 받아 들일 수 있도록 친절하게 표시 하시겠습니까? – Konstantin

    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에서 가져올 수 있음).

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