2009-02-16 9 views
4

J'utilise LINQ et j'ai du mal à comprendre comment je peux faire fonctionner de nouvelles classes de "modèle de domaine" dans LINQ lors d'une requête entre tables. J'utilise Linq to SQL, et C# dans .NET 3.5.Implémentation de IEnumerable

Supposons que je veux une classe Client étendue:

public class ExtendedClient 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string strVal { get; set; } 
} 

et dans ma couche de données, je veux remplir ce de deux tables (cc est mon DataContext):

public ExtendedClient getExtendedClient(int clientID) 
{ 
    var c = dc.GetTable<tClient>(); 
    var cs = dc.GetTable<tClientSetting>(); 
    var q = from client in c 
      join setting in cs 
      on client.ClientID equals setting.ClientID 
      where client.ClientID == clientID 
      select new ExtendedClient { client, setting.strValue }; 
    return q; 
} 

Je suis en train pour renvoyer la ligne dans la table tClient plus une colonne supplémentaire dans tClientSetting.

Les erreurs gênantes que je reçois sont: Impossible d'initialiser le type « ExtendedClient » avec un initialiseur de collection, car il ne met pas en œuvre « System.Collections.IEnumerable » et Impossible de convertir implicitement le type « System.Linq.IQueryable » à ' ExtendedClient '. Une conversion explicite existe (manque-t-il un cast?)

Je réalise que c'est une erreur de base, mais je ne peux pas déterminer comment MEILLEUR pour implémenter le IEnumerable parce que je ne peux pas trouver un exemple.

Dois-je faire à chaque fois Je veux un objet spécialisé? Merci d'avance.

Répondre

6
public ExtendedClient getExtendedClient(int clientID) 
{ 
    var c = dc.GetTable<tClient>(); 
    var cs = dc.GetTable<tClientSetting>(); 
    var q = from client in c 
      join setting in cs 
      on client.ClientID equals setting.ClientID 
      where client.ClientID == clientID 
      select new ExtendedClient { ID = client.ClientID, Name = client.Name, strVal = setting.strValue }; 
    return q.Single(); 
} 

Vous devez faire une chose semblable chaque fois que vous devez retour un objet spécialisé. Si vous n'avez pas besoin de le retourner, vous n'avez pas besoin de spécifier le type et vous n'aurez pas besoin d'une classe spéciale. Vous pouvez utiliser des types anonymes:

from client in c 
join setting in cs 
on client.ClientID equals setting.ClientID 
where client.ClientID == clientID 
select new { ID = client.ClientID, Name = client.Name, strVal = setting.strValue }; 
0

Pourquoi utilisez-vous un type spécial pour cela?

Je pense que vous pouvez faire client.Settings.strValue si vous configurez la relation Client-Paramètres pour créer une propriété Client.Settings (au lieu de Settings.Client). Et autant que je me souviens d'une telle configuration est possible dans LINQ.