2011-02-04 5 views
2

Je suis relativement nouveau dans Linq to Entities mais je progresse bien. Un élément que je n'ai pas encore réussi à comprendre est comment extraire les noms de colonnes de la base de données. Par exemple, dans le code ci-dessous, je voudrais remplacer les constantes par les noms de champs de la base de données.Linq to Entities To Noms de colonnes

Je n'ai pas été en mesure d'obtenir les réponses que j'ai vues ailleurs travailler.

Toute aide sera appréciée.

Bob

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

** Pourquoi diable ** accédez-vous à vos données avec un ORM comme Entity Framework, mais en le convertissant en lignes/colonnes dans votre programme? Cela n'a aucun sens ... ** ** soit rester avec ADO.NET classique et en utilisant DataTable/DataRow, ** ou ** passer à EF, puis utiliser ** objets ** - pas lignes et colonnes dans votre code ... –

Répondre

2

La seule façon de convertir une entité LINQ à un DataTable est dynamique à utiliser la réflexion pour obtenir les noms:

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

et un processus similaire pour mettre à jour les lignes:

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

EDIT: Pour gérer Nullable, faire:

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

HTH.

+0

Cela semble prometteur, mais il échoue dans le premier champ nullable essayant de récupérer PropertyType. L'exception est [System.NotSupportedException] = {"DataSet ne prend pas en charge System.Nullable <>."}. La plupart de mes champs sont nullables –

+0

OK, alors vous auriez à détecter si c'est un Nullable <>, puis utilisez la méthode GetGenericArguments() [0] pour obtenir le type interne. –

+0

Brian, Merci encore une fois. Je ne peux pas trouver la syntaxe exacte dont j'ai besoin pour que ce code fonctionne. prop.PropertyType.GetGenericArguments() [0] ne semble pas fonctionner. –