2009-05-12 9 views
17

Existe-t-il un moyen pour pas de d'aller chercher une colonne spécifique en utilisant linqtosql sans avoir à utiliser un type anonyme et spécifier chaque retourné individuellement?Linq to SQL - Ne pas aller chercher une colonne particulière

Nous utilisons SQLMetal pour générer le fichier dbml qui contient tous les types dans lesquels placer les résultats de données interrogés. Cependant, lorsque des colonnes select sont incluses dans la requête linq, les résultats vont dans un type anonyme au lieu du type déclaré dans le fichier dbml. Je voudrais sélectionner tous sauf un des colonnes d'une table particulière, mais toujours avoir les résultats retournés dans le type dbml associé.

Toutes les idées ont été appréciées.

Répondre

1

Merci à tous pour votre contribution. La solution finale sur laquelle je me suis arrêté est de simplement spécifier les colonnes que je veux ramener MAIS de le faire dans l'instruction Linq dans un nouvel objet du type que je veux ... un exemple devrait aider!:

Table journal a trois colonnes

  • LogID
  • DateLogged
  • SerializedData

Mais je ne veux que DateLogged & données sérialisés. Cependant, je voudrais que ce au sein une DataContainer générée par SQLMetal

J'obtenu avec le déclaration suivante:


Dim q = De Logitem Dans dc.Log Sélectionnez un nouveau journal avec {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}


espoir qui aide quelqu'un d'autre là-bas!

+1

Vous avez raison, vous pouvez utiliser une classe « nommée » au lieu d'un classe anonyme, mais vous "spécifiez toujours chaque champ retourné individuellement", ce que vous avez dit dans votre question que vous ne vouliez pas faire: P – Lucas

0

La façon dont LINQ to SQL sait quelles colonnes inclure est par le type anonyme que vous projetez sur la requête. Je ne pense pas qu'il existe un autre moyen d'exclure des colonnes LINQ to SQL, car une projection rectiligne retournera tout.

17

LINQ to SQL prend en charge lazy loading propriétés individuelles. Dans le concepteur DBML, vous pouvez définir Delay Loaded à true dans les propriétés d'une colonne. Les colonnes chargées en différé ne seront pas incluses dans le SELECT initial. Si vous essayez d'accéder à la propriété de l'objet et qu'il n'a pas encore été chargé, une autre instruction SELECT sera exécutée pour amener cette valeur à partir de la base de données.

Si vous modifiez le fichier DBML à la main, définissez <Column IsDelayLoaded="true">. Si vous écrivez vos classes LINQ to SQL manuellement, il est aussi simple que de déclarer le champ de sauvegarde de la propriété comme Link<T> au lieu de T. Par exemple:

[Table] 
public class Person 
{ 
    private Link<string> _name; 

    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name.Value; } 
     set { _name.Value = value; } 
    } 
} 

Voir aussi la section "Delay/Lazy Loading" dans this post by Scott Guthrie.


Mise à jour: La réponse ci-dessus s'applique si vous souhaitez que la colonne soit toujours disponible lorsque vous en avez besoin. Il ne sera pas intégré dans SELECT si vous le demandez spécifiquement (consultez LoadOptions) ou d'essayer d'y accéder.

Si vous ne voulez tout simplement pas utiliser ou accéder à la colonne et que vous ne souhaitez pas la voir comme propriété de classe, passez à Serapth's answer pour supprimer la colonne du fichier DBML. Assurez-vous de bien comprendre les implications, telles que la perte de contrôle de concurrence sur cette colonne.

4

Si vous êtes extrêmement paresseux, pourquoi ne pas ajouter la table une seconde fois via le concepteur DBML, la renommer MyTableWithOutColumnX puis supprimer l'enregistrement que vous ne voulez pas renvoyer? Juste hilite le nom de la colonne et appuyez sur supprimer.

Son bâclé, mais alors, dans une certaine mesure, est d'avoir une table où un enregistrement ne devrait pas apparaître parfois. Plus que tout, c'est facile, tout est abstrait dans le DBML, donc cela ne devrait pas avoir d'impact sur votre code, à part changer la table à laquelle accéder. Bien nommé, il pourrait même avoir du sens pour quelqu'un qui maintient votre code dans un futur lointain.

1

Examinez this link pour obtenir un exemple d'activation du chargement différé de colonnes à l'aide de SQLMetal.

Il utilise essentiellement XSLT pour post-traiter le fichier généré pour convertir le type de colonne X-Link<X> (les deux types de la System.Data.Linq namesapce)