2009-01-20 6 views
1

J'ai deux tables 1) Produit 2) CatégoriesLINQ to SQL et récupérer uniquement les lignes spécifiques de tables jointes

table de produit a un champ appelé "CategoryID" et la table de catégorie a un champ appelé "CategoryName", ID , DateCreated, et quelques autres. Je veux utiliser LINQ to SQL pour interroger toutes les lignes de produits ainsi que juste le Category.CategoryName. Cette requête sera utilisée dans une source de données et sera liée à un ListView.

Je sais que je peux utiliser l'option LoadWith avec le DataContext et une jointure. Mais le problème est que je me retrouve avec tous les les lignes de produit et de catégorie. Ce que je veux vraiment est toutes les lignes de produits et juste le Category.CategoryName

La solution parfaite serait si l'option LoadWith vous permettrait de spécifier les champs pour revenir mais comme answered here, ce n'est pas possible.

J'ai trouvé d'une manière pour le faire, créer une classe personnalisée qui a les mêmes champs que je veux retourner. Par exemple,

public class ProductInfo 
{ 
    public string ProdName { get; set; } 
    public int ProdID { get; set; } 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 
} 

mais le problème est que l'instruction select finit vraiment très longtemps. par exemple ...

var products = from p in db.Products 
       join c in db.Categories on p.CategoryID = c.ID 
       select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID, 
CategoryID = p.CategoryID, CategoryName = c.CategoryName } 

cela devient vraiment sujet aux erreurs.

Donc, ma question - y at-il une meilleure façon d'accomplir cela?

Modifier/Précision: i aurait dû mentionner que la raison pour laquelle je besoin de la classe intermédiaire est parce que je dois être en mesure de retourner le résultat défini comme un type particulier, dans ce cas ProductInfo

Répondre

1

Je pense que vous sommes à peu près sur la bonne voie, mais je voudrais vous inquiétez pas vraiment de la classe intermediery:

var products = from p in db.Products 
      join c in db.Categories on p.CategoryID = c.ID 
      select new { p.ProdName, ProdId = p.ID, p.CategoryID, 
       CategoryName = c.CategoryName } 

Vous pouvez ensuite le fil dans ce cas Sélection du LinqDataSource. Scott Guthrie parle dans la section "Effectuer des projections de requêtes personnalisées avec l'événement de sélection" dans son message "Using a Custom Linq Expression with the asp:LinqDataSource" control".

0

Zut, je aurais dû mentionner que la raison pour laquelle je besoin de la classe intermédiaire est parce que je dois être en mesure de retourner le résultat défini comme un type particulier, dans ce cas ProductInfo

0
List<ProductInfo> products = (from p in db.Products 
       join c in db.Categories on p.CategoryID = c.ID 
       select new ProductInfo { ProdName = p.ProdName, ProdID = p.ID, 
CategoryID = p.CategoryID, CategoryName = c.CategoryName }).ToList<ProductInfo>();