2010-09-23 14 views
0

J'utilise LinqToSql sur un projet, et Ria services pour l'exposer comme un IQueryable. Je veux envoyer ma table de produit avec ses tables enfants (par exemple ProductStatus, ProductCategory)Chargement de la table enfant avec les services LinqToSql et RIA

Pour ce faire, je suis en utilisant la norme

public IQueryable ProductSelect() {

DataLoadOptions loadOpts = new DataLoadOptions(); 
loadOpts.LoadWith<Product>(p => p.ProductStatus); 
loadOpts.LoadWith<Product>(p => p.ProductCategory); 
this.DataContext.LoadOptions = loadOpts; 

return this.DataContext.Products; } 

Malheureusement cela crée des jointures internes, et non gauche rejoint . Il n'y a pas d'intégrité référentielle sur les tables (je ne peux pas l'ajouter).

Cela signifie que s'il n'y a pas d'enregistrement correspondant dans la table enfant, le produit ne sera pas sélectionné. Est-ce que quelqu'un sait comment changer cela pour devenir une jointure gauche?

Répondre

0

J'ai trouvé la réponse. Dans le fichier DBML où j'ai les tables et les associations. Il est lié à la clé étrangère Ids.

Si la clé étrangère n'est pas NULL, elle effectue une jointure interne. si vous rendez le champ nullable, alors il fera une jointure à gauche.

0

Que diriez-vous de quelque chose comme la question ci-dessous? Cela vous donnera un type anonyme composé de 3 propriétés. Certains seront null lorsque la 'jointure à gauche' aurait produit null.

var products= 
     from p in db.Products 
     from pc 
     in db.ProductCategory 
      .Where(x => x.Id == p.ProductCategoryId) 
      .DefaultIfEmpty() 
     from ps 
     in db.ProductStatus 
      .Where(x => x.Id == p.ProductStatusId) 
      .DefaultIfEmpty() 
     select new { Product = p, ProductCategory = pc, ProductStatus = ps} 
+0

@David, j'espère que cela aurait aidé de toute façon! –