2009-03-25 5 views
1

Dans LINQ, je souhaite projeter des noms différents de ceux des tables de base de données. "Noms conviviaux" que je peux utiliser pour les en-têtes de colonne. Les noms qui ont "%" ou éventuellement un "" (espace). La requête ci-dessous ne compilera pas.Quelles options ai-je pour les projections LINQ?

Est-ce que quelque chose comme ça est possible ou est-ce que je suis coincé en utilisant le _ underscore redouté pour tout?

dim query = from p in ctx.SomeTable() _ 
    select ProductName = p.product_name, _ 
      [Expiration Date] = p.expiration_date, 
      [% of sales] = p.pct_sales 

Répondre

1

Il est certainement possible de projeter différents noms pour les champs de la base de données en utilisant la clause select. Cependant, les noms choisis doivent toujours être des identificateurs VB valides. Cela vous empêchera d'utiliser un espace ou%

0

Pour la partie sélectionnez de votre requête LINQ, utilisez quelque chose comme

select new { MyNewProductName = p.product_name, MySillyColumnTitle = p.pct_sales } 

et ainsi de suite. Ces propriétés seront automatiquement créées pour la collection IEnumerable renvoyée par la requête.

+0

C'est C#, le questionneur semble aller pour VB.Net – JaredPar

3

Dans LINQ, vous devez toujours respecter les règles de dénomination des variables qui n'autorisent pas les espaces ou les signes%.

3

Vous devez toujours créer des noms de variables valides. Attacher le nom d'affichage au nom de la variable serait une très mauvaise idée, IMO. Il n'y a absolument aucune chance que l'i18n, qui bien sûr ne soit pas un problème pour vous - mais il forme un lien trop étroit entre l'interface utilisateur et le code d'accès aux données.

Il serait préférable de spécifier les en-têtes de colonnes séparément. De cette façon, vous obtenez des noms de variables sensibles, faciles à utiliser à partir du code, et des en-têtes de colonnes qui ne sont pas limités par les règles ou les identifiants.

+0

@ Jon - +1 pour la séparation des préoccupations, Le modèle de données doit être distinct de la présentation. Je pense que vous parlez de problèmes de caractère international quand vous dites i18n? – Maslow

0

Si vous faites une classe qui se trouve entre votre LINQ et votre interface utilisateur, vous pouvez utiliser

Imports System.ComponentModel 

Public NotInheritable Class ModelSomeTable 

'Help prevent accidental direct field access in the class 
<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _ 
private _pct_sales as decimal 

'Components will know what to use for the heading 
<Display("% of sales")> _ 
Public ReadOnly Property pct_sales() As decimal 
    Get 
     Return _pct_sales 
    End Get 
End Property 

'code can see it, datagrids/datagridviews and other components won't 
private _RowId as integer 
<Browsable(false)> _ 
    Public ReadOnly Property RowId() As integer 
    Get 
     Return _RowId 
    End Get 
End Property 

End Class 
Questions connexes