2011-02-04 4 views
2

저는 Linq에 Entities에 비교적 새로 왔습니다만 좋은 진행을하고 있습니다. 내가 아직 파악할 수 없었던 한 가지 항목은 데이터베이스에서 열 이름을 추출하는 방법입니다. 예를 들어 아래의 코드에서 상수를 데이터베이스의 필드 이름으로 바꾸고 싶습니다.Linq to 엔티티 To 열 이름

나는 eleswhere가 작동하는 것을 보았지만 대답을 얻지 못했습니다.

도움이 될 것입니다. 행을 업데이트하는

var props = typeof(FMCSA_NPR).GetProperties(); 
foreach (var prop in props) 
{ 
    dtNPRS.Columns.Add(prop.Name, prop.PropertyType); 
} 

와 유사한 과정 :

DataTable dtNPRS = new DataTable(); 

const string kInitDate = "NPR_Init_Date"; 
const string kActive = "Active"; 
const string kStatusId = "NPR_Status_Id"; 

try 
{ 
    DataRow drNPR; 

    var nprs = (from n in db.FMCSA_NPR 
       join u in db.FMCSA_USER on n.CREATED_BY equals u.ID 
       join t in db.LKUP_NPR_TYPE on n.NPR_TYPE_ID equals t.ID 
       join s in db.LKUP_AUDIT_STATUS on n.NPR_STATUS_ID equals s.ID 
       where n.ROLE_ID == pRoleId && n.OWNER_ID == pOwnerId 
         && n.NPR_STATUS_ID == pNPRStatusId && n.ACTIVE == pActive 
       select n).ToList(); 

    if (nprs.Count() == 0) 
     return null; 

    ///build the table structure we need 
    dtNPRS.Columns.Add(kInitDate, typeof(DateTime)); 
    dtNPRS.Columns.Add(kActive,typeof(bool)); 
    dtNPRS.Columns.Add(kStatusId,typeof(Int32)); 

    foreach (var npr in nprs) 
    { 
     drNPR = dtNPRS.NewRow(); 
     drNPR[kInitDate] = npr.NPR_INIT_DATE; 
     drNPR[kActive] = npr.ACTIVE; 
     drNPR[kStatusId] = npr.NPR_STATUS_ID; 
     dtNPRS.Rows.Add(drNPR); 
    } 

    return dtNPRS; 
} 
+9

** ** Entity Framework와 같은 ORM을 사용하여 데이터에 액세스하고 있지만 프로그램의 행/열로 다시 변환하는 이유는 무엇입니까 ?? 그것은 전혀 이해가되지 않습니다. ** ** 고전적인 ADO.NET을 유지하고 DataTable/DataRow, ** 또는 ** EF로 전환 한 다음 ** 객체 ** -를 사용하십시오. 행 및 열을 ... –

답변

2

동적으로 DataTable을로 LINQ 엔티티로 변환 할 수있는 유일한 방법은 이름을 얻기 위해 반사를 사용하는 것입니다

foreach (var prop in props) 
{ 
    dtNPR[prop.Name] = prop.GetValue(npr, null); 
} 

편집이 : Null 허용을 처리하는 방법은 수행

,
if (prop.PropertyType.Equals(typeof(Nullable<>))) 
    var type = prop.PropertyType.GetGenericArguments()[0]; 

HTH.

+0

이것은 확실히 유망 해 보이지만 PropertyType을 검색하려고하는 첫 번째 nullable 필드가 실패합니다. 예외는 [System.NotSupportedException] = { "DataSet은 System.Nullable <>을 지원하지 않습니다."}입니다. 내 필드의 대부분은 nullable입니다. –

+0

그렇다면 Nullable <>을 검색 한 다음 GetGenericArguments() [0] 메서드를 사용하여 내부 형식을 가져와야합니다. –

+0

브라이언, 다시 한번 감사드립니다. 이 코드를 작동시키는 데 필요한 정확한 구문을 이해할 수 없습니다. prop.PropertyType.GetGenericArguments() [0]이 작동하지 않는 것 같습니다. –