2010-12-10 4 views
0

ASP.NET 3.5 C#
Je joins deux tables en utilisant Linq.
Les noms de table sont MapAssets et ExitPoint.
Dans la base de données, ils sont en relation avec « a une relation »Comment retourner Generic.List <Anonymoustype> à partir d'une fonction en C#

Je suis en train d'écrire une fonction dans mon BLL pour retourner la table jointe

 public List<ExitPoints> GetExitPointDetailsByProjectID(int iProjectID) 
     { 
      ctx = new CoreDBDataContext(); 
      var exitPointDetails = from ma in ctx.MapAssets 
            join ep in ctx.ExitPoints 
            on ma.MapAssetID equals ep.MapAssetID 
            where ma.ProjectID == iProjectID 
            select new 
            { 
             //would like to have data from both tables here 
             ctx.MapAssets, 
             ctx.ExitPoints 
            }; 
      return exitPointDetails.ToList(); 
     } 

Cela ne obviuosly fonctionne pas. Et je ne sais pas quoi retourner.
Toute la contrainte que j'ai pour le retour est de pouvoir être lié à un gridview.
est-ce la bonne façon? Ou alors, quelle est la bonne façon?

Répondre

6

Vous ne pouvez pas, ou mieux, le seul moyen est de les renvoyer dans un boxed List de object, mais cela complique énormément les choses, parce que vous ne pouvez pas les jeter à tout type (bien sûr, il est anonyme) et vous ne peut accéder à leurs propriétés par la réflexion ....

Dans des cas comme ça, je vous suggère fortement de créer une classe personnalisée.

EDIT:

Sur une note côté ...
Si vous utilisez .net 4, les choses seraient plus faciles parce que vous pourriez le rendement dynamic Type au lieu de object (regardez ce link pour voir dynamic ' s simplifications), mais je préférerais créer une classe personnalisée de toute façon.

+0

Il utilise 3.5, ne peut pas utiliser dynamique. – Phill

+0

dans .net 3.5 il n'y a pas de dynamique –

+0

Oh, désolé, je n'ai pas remarqué la version. Édité merci;) – digEmAll

1

Vous ne pouvez pas renvoyer un type anonyme, vous ne pouvez utiliser qu'un type anonyme dans la portée de la méthode dans laquelle il se trouve. Vous devrez peut-être créer une nouvelle classe avec les propriétés MapAssets/ExitPoints et sélectionner une nouvelle instance de cette classe .

-2

ne fonctionne pas?

ctx = new CoreDBDataContext(); 
var exitPointDetails = from ma in ctx.MapAssets 
         join ep in ctx.ExitPoints 
          on ma.MapAssetID equals ep.MapAssetID 
         where ma.ProjectID == iProjectID 
         select Tuple.Create(ma, ep); 
return exitPointDetails.ToList(); 
+0

Tuple est .NET 4 seulement. – Euphoric

+0

S'il vous plaît noter que je m'inquiétais de retour type – naveen

1

Vous essayez de retourner Liste ExitPoints et Liste des MapAssets qui n'est pas possible parce que vous obtenez la sortie des deux tables-à-dire ExitPoints et MapAssets. Et il n'est également pas possible de retourner un type anonyme. Donc, afin de retrou- ver la requête, créez un nom de classe ExMapClass avec les propriétés dont vous avez besoin comme sortie des requêtes. Maintenant, après l'exécution de la requête LINQ que vous avez écrit ce itérer-à-dire

créer une liste de la liste des classes

nouvellement créé newclass = nouvelle liste();

foreach (var résultat dans CTX) {

instancier la classe créée

obj.Property1 = var.MapAssets;

obj.Property2 = var.ExitPoints;

newclass.add (obj);

}

retrun maintenant la liste des classes newlycreated.

espérons que vous l'avez.

+0

merci un million de compagnon. J'ai utilisé 'select new MyCustomClass' au lieu de 'select new' plutôt que de recommencer à zéro dans le jeu de résultats – naveen

1

Devez-vous vous lier à cet objet après l'avoir créé? Sinon, vous pouvez créer une classe « AnonymousType persistante » qui stocke les valeurs dans un dictionnaire et renvoie les valeurs de propriété avec une méthode comme:

string lastName AnonType.GetValue<string>("LastName"); 
int age AnonType.GetValue<int>("Age"); 

Voici un lien vers un excellent example. L'auteur a également un example where he creates the "AnonymousType" from a datatable.

Je travaille sur une variation de cette where I provide the ability to query une liste de "AnonymousType" avec la syntaxe suivante:

// est ici la requête var = dept13 anonAgents.AsQueryable() . où (x => x.Has ("Département", Compare.Equal, 13);

// Voici comment la liste est construite

private static AnonymousType ProvisionAgent(string name, int department) 
     { 
      return AnonymousType.Create(new 
      { 
       Name = name, 
       Department = department 
      }); 
     } 

     private List<AnonymousType> CreateAnonAgentList() 
     { 
      var anonAgents = new List<AnonymousType>(); 

      // Dave and Cal are in Department 13 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Dan Jacobs", 13, 44))); 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Calvin Jones", 13, 60))); 

      // Leasing = Dept 45 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stanley Schmidt", 45, 36))); 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Jeff Piper", 45, 32))); 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stewart Blum", 45, 41))); 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Stuart Green", 45, 38))); 

      // HR = Dept 21 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Brian Perth", 21, 25))); 
      anonAgents.Add(AnonymousType.Create(CreateAgentAnonType("Katherine McDonnel", 21, 23))); 

      return anonAgents; 
     } 
2

Jetez un oeil à la façon de retourner anonyme types de Method.

http://forums.asp.net/t/1387455.aspx.

Copie du code à partir du lien.

object ReturnAnonymous() 
{ 
    return new { Name="Faisal", City="Chakwal" }; 
} 

// Application entry-point 
void Main() 
{ 

    object o = ReturnAnonymous(); 

    // This call to 'Cast' method converts first parameter (object) to the 
    // same type as the type of second parameter - which is in this case 
    // anonymous type with 'Name' and 'City' properties 
    var typed = Cast(o, new { Name="", City="" }); 
    Console.WriteLine("Name={0}, City={1}", typed.Name, typed.City); 
} 

// Cast method - thanks to type inference when calling methods it 
// is possible to cast object to type without knowing the type name 
T Cast<T>(object obj, T type) 
{ 
    return (T)obj; 
} 

Vous pouvez utiliser la méthode mentionnée ci-dessous pour retourner la liste et

List<object> lstAnonymousTypes = GetExitPointDetailsByProjectID(1); 

foreach(object o in lstAnonymousTypes) 
{ 
    //Change it accordingly 
    var typed = Cast(o, new { new MapAssets() , new ExitPoints() }); 
} 

Hope this helps pas essayé.

0

utiliser juste et ArrayList

public static ArrayList GetMembersItems(string ProjectGuid) 
    { 
     ArrayList items = new ArrayList(); 
     items.AddRange(yourVariable 
         .Where(p => p.yourProperty == something) 
         .ToList()); 
     return items; 
    } 
Questions connexes