2011-02-16 9 views
12

J'ai deux tables A & B. Je peux déclencher Linq requêtes & obtenir les données requises pour les tables individuelles. Comme je sais ce que chacune des tables retournera comme indiqué dans l'exemple. Mais, lorsque je rejoins les deux tables, je ne suis pas au courant du type de retour de la requête Linq. Ce problème peut être résolu en créant une classe qui conservera les propriétés ID, Name et Address à l'intérieur. mais, à chaque fois avant d'écrire une requête de jointure en fonction du type de retour, je vais devoir créer une classe qui n'est pas une façon convinient Y at-il d'autres Mathod disponibles pour atteindre cetQuel est le type de retour de ma requête linq?

private IList<A> GetA() 
    { 
     var query = from a in objA 
        select a; 
     return query.ToList(); 
    } 

    private IList<B> GetB() 
    { 
     var query = from b in objB 
        select b; 
     return query.ToList(); 
    } 

    private IList<**returnType**?> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new { a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
+1

http://stackoverflow.com/questions/534690/linq-to-sql-return-anonymous-type – Jordan

Répondre

1

La valeur que vous générez est appelée type anonyme et vous pouvez le retourner à moins que vous revenez object comme:

private object GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

Il y a deux bonnes solutions: 1.
est de générer une classe pour correspondre à la sortie et générer comme solution Kobi
2. si vous utilisez .net 4 vous pouvez retourner un type dynamic comme

private dynamic GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new { a.ID, a.Name, b.Address }; 
    return query.ToList(); 
} 

alors vous pouvez utilisez-le plus tard. Vous pouvez rechercher sur Internet l'avantage d'utiliser le mot-clé dynamic. `Dynamic` est destiné à être utilisé avec des objets COM, et non comme remplacement pour une conception correcte.

+3

Cela rendra le développement très difficile - vous perdrez l'intellisense, et toutes les erreurs de compilation se transformeront en ** erreurs d'exécution **. 'object' est seulement un peu mieux, car vous êtes limité à des erreurs d'exécution de cast invalides. À tout le moins, tester beaucoup. – Kobi

+0

Oui, je sais, vous avez tout à fait raison, mais parfois, même si je suis contre, vous devez utiliser pour satisfaire vos besoins. –

14

Vous avez créé une classe anonyme - Vous ne pouvez pas vraiment le retourner. Une solution simple consiste à ajouter une classe pour représenter votre type.

Par exemple:

public class UserWithAddress 
{ 
    public UserWithAddress(int id, string name, string address) 
    { 
     ID = id; 
     Name = name; 
     Address = address; 
    } 

    // you may have your own types here 
    public int ID { get; set; } 
    public String Name { get; set; } 
    public String Address { get; set; } 
} 

Et puis:

private IList<UserWithAddress> GetJoinAAndB() 
{ 
    var query = from a in objA 
       join b in objB 
       on a.ID equals b.AID 
       select new UserWithAddress(a.ID, a.Name, b.Address); 
    return query.ToList(); 
} 
2

Comme vous l'avez créé un anonyme (types anonymes sont générés par le compilateur, donc nous ne pouvons pas connaître le nom du type dans nos codes) de sorte que vous ne pouvez pas le renvoyer.Créer une classe distincte avec trois propriétés Id, Nom et adresse, puis l'a renvoyé.

public class Contact 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public string Address { get; set; } 

     } 

private IList<Contact> GetJoinAAndB() 
    { 
     var query = from a in objA 
        join b in objB 
        on a.ID equals b.AID 
        select new Contact{ a.ID, a.Name, b.Address }; 
     return query.ToList(); 
    } 
3

Comme dit Kobi.

Si vous ne souhaitez pas créer de classe spécifiquement pour ce cas, vous pouvez utiliser un Tuple. Seulement supporté. Net 4 cependant.

Questions connexes