2010-04-01 4 views
0

Je fais en sorte que cette méthode récupère les enregistrements de la base de données. Comme vous pouvez le voir, je veux retourner un List<ITieneID>ITieneID est une interface définie sur ma couche de gestion.Existe-t-il une meilleure façon de faire cette requête et cette fonction Linq?

AtlasWFM_Entities.Clases.Area implémente cette interface. Il est assez clair que ce n'est pas un bon moyen de l'accomplir. Voici le code:

public override List<ITieneID> Buscar(ITieneID elementoPatron) 
    { 
     List<ITieneID> result = new List<ITieneID>(); 

     var resultado = from a in base.Repository.Context.Areas 
         where a.areaID.Equals(elementoPatron.ID) || a.areaDescripcion.Contains(elementoPatron.Descripcion) 
         select new AtlasWFM_Entities.Clases.Area 
         { 
          ID = a.areaID, 
          Descripcion = a.areaDescripcion, 
          Estado = a.areaEstado, 
         }; 

     foreach (var r in resultado) 
     { 
      ITieneID t = new AtlasWFM_Entities.Clases.Area 
      { 
       ID = r.ID, 
       Descripcion = r.Descripcion, 
       Estado = r.Estado, 
      }; 
      result.Add(t); 
     } 
     return result; 
    } 

Toutes les idées comment améliorer cela?

Répondre

1
public override List<ITieneID> Buscar(ITieneID elementoPatron) 
    { 
     var resultado = from a in base.Repository.Context.Areas 
         where a.areaID.Equals(elementoPatron.ID) || a.areaDescripcion.Contains(elementoPatron.Descripcion) 
         select new AtlasWFM_Entities.Clases.Area 
         { 
          ID = a.areaID, 
          Descripcion = a.areaDescripcion, 
          Estado = a.areaEstado, 
         }; 
     return new List<ITieneID>(resultado); 
    } 

MISE À JOUR: Ce ne compile pas, mais cela devrait:

 return new List<ITieneID>(resultado.Cast<ITieneID>()); 

En fait, je pense que vous pouvez réduire la rien à:

public override List<ITieneID> Buscar(ITieneID elementoPatron) 
    { 
     var resultado = from a in base.Repository.Context.Areas 
         where a.areaID == elementoPatron.ID || a.areaDescripcion.Contains(elementoPatron.Descripcion) 
         select a; 
     return new List<ITieneID>(resultado.Cast<ITieneID>()); 
    } 

d'un peu plus concis:

public override List<ITieneID> Buscar(ITieneID elementoPatron) 
{ 
     return new List<ITieneID>(base.Repository.Context.Areas 
       .Where(a=>a.areaID == elementoPatron.ID || a.areaDescripcion.Contains(elementoPatron.Descripcion)) 
       .Cast<ITieneID>()); 
} 
+0

I * suspect * LINQ to SQL ne va pas aimer l'utilisation de la classe Area ici - Je pense qu'il y a des restrictions sur les types que vous pouvez construire. Je pourrais toutefois avoir tord. –

+0

est-ce que même compiler? – Nix

+0

Eh bien John, OP l'utilise déjà - seul OP obtient un groupe de zone, puis l'utilise pour instancier un autre groupe de zone pour une raison criptique. – ANeves

1

Si la zone implémente l'interface ITieneID juste faire

var resultado = from a in base.Repository.Context.Areas 
        where a.areaID.Equals(elementoPatron.ID) || a.areaDescripcion.Contains(elementoPatron.Descripcion) 
        select new AtlasWFM_Entities.Clases.Area 
        { 
         ID = a.areaID, 
         Descripcion = a.areaDescripcion, 
         Estado = a.areaEstado, 
        }; 


    result = resultado.ToList().ConvertAll(x=> x as ITieneID); 

    return result; 
+0

@Non, celui-ci ne fonctionne pas puisque ConvertAll est juste une extension pour les types LIST et non pour IQueryable. – MRFerocius

+0

avez-vous ajouté .ToList() je viens d'éditer le ci-dessus ... – Nix

+0

merci c'est compiler maintenant et j'espère travailler aussi. Merci mon pote! – MRFerocius

1

Eh bien, si vous avez besoin de le faire dans deux « houblon » afin de contourner tout LINQ à des limitations de SQL, vous pouvez utiliser LINQ to SQL et LINQ to Objects:

var resultado = from a in base.Repository.Context.Areas 
       where a.areaID.Equals(elementoPatron.ID) || 
         a.areaDescripcion.Contains(elementoPatron.Descripcion) 
       select new AtlasWFM_Entities.Clases.Area 
       { 
        ID = a.areaID, 
        Descripcion = a.areaDescripcion, 
        Estado = a.areaEstado, 
       }; 

return resultado.AsEnumerable() // Do the rest in LINQ to objects 
       .Select(r => new AtlasWFM_Entities.Clases.Area 
         { 
          ID = r.ID, 
          Descripcion = r.Descripcion, 
          Estado = r.Estado, 
         }) 
       .ToList(); 
Questions connexes