2009-09-21 7 views
1

J'essaie de pré-extraire certaines données de clé étrangère à l'aide d'une requête linq. Un exemple rapide pour expliquer mon problème suit:LINQ: Pré-extraction de données à partir d'une seconde table

var results = (from c in _customers 
       from ct in _customerTypes 
       where c.TypeId == ct.TypeId 
       select new Customer 
          { 
          CustomerId = c.CustomerId, 
          Name = c.Name, 
          TypeId = c.TypeId, 
          TypeName = ct.TypeName, <-- Trying to Prefetch this 
          }).ToList(); 

La classe client ressemble:

[Table(Name = "Customers")] 
public class Customer 
{ 
    [Column(Name = "CustomerId", IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
    public int CustomerId { get; set; } 

    [Column(Name = "Name")] 
    public string Name { get; set; } 

    [Column(Name = "TypeId")] 
    public int TypeId { get; set;} 

    public string TypeName { get; set; } 

    public Confession(){} 
} 

Cependant LINQ ne vous permettra de le faire jeter NotSupportedException avec « la construction explicite de type d'entité « client » dans la requête n'est pas autorisé. "

Je m'approche clairement de ce problème. Tout pointeur dans la bonne direction serait le plus utile.

Répondre

1

Comme il est dit, vous ne pouvez pas y construire un client. La meilleure chose à faire (sans doute) serait de créer une nouvelle classe qui encapsule les propriétés dont vous avez besoin. Vous pouvez obtenir tout de la classe client en le faisant comme ceci:

var results = (from c in _customers 
       from ct in _customerTypes 
       where c.TypeId == ct.TypeId 
       select new 
         { 
         Customer = c, 
         TypeName = ct.TypeName 
         }).ToList(); 
0

Si vous voulez faire une véritable pré-chargement, vous pouvez effectuer les opérations suivantes:

(Cela suppose qu'il ya une jointure entre le Customer et CustomerType tables de votre base de données, et que LINQ to SQL sait.)

MyDataContext dc = new MyDataContext(); // Use your application-specific DataContext class 
DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<Customer>(c => c.CustomerType); 
dc.LoadOptions = loadOptions; 
var results = from c in dc.GetTable<Customer>() select c; 

Vous pouvez alors accéder au TypeName ainsi (où c est un Customer dans results):

c.CustomerType.TypeName; 
Questions connexes