2010-04-01 4 views
0

Я делаю этот метод извлечения записей из базы данных. Как вы можете видеть, я хочу вернуть List<ITieneID>, где ITieneID - это интерфейс, определенный на моем бизнес-уровне.Есть ли лучший способ сделать этот запрос и функцию Linq?

AtlasWFM_Entities.Clases.Area реализует этот интерфейс. Совершенно ясно, что это не очень хороший способ ее достижения. Вот код:

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; 
    } 

Любые идеи, как улучшить это?

ответ

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); 
    } 

UPDATE: Это не компилировать, но это должно:

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

На самом деле, я думаю, вы можете уменьшить все это:

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>()); 
    } 

немного более кратким:

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 не понравится использование класса Area здесь - я думаю, что существуют ограничения на типы, которые вы можете создать. Я мог ошибаться. –

+0

делает это даже скомпилировать? – Nix

+0

Well John, OP уже использует его - только OP получает группу Area, а затем использует ее для создания экземпляра другой группы Area для некоторой критической причины. – ANeves

1

Если зона реализует интерфейс 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, 
        }; 


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

    return result; 
+0

@Nix, этот не работает с тех пор, как ConvertAll является просто расширением для типов LIST и нет для IQueryable. – MRFerocius

+0

вы добавили .ToList() я только что отредактировал выше ... – Nix

+0

спасибо, что это компиляция сейчас, и я надеюсь, что тоже работаю. Благодарю вас! – MRFerocius

1

Ну, если вам нужно сделать, это в двух «хмель», чтобы работать вокруг любого LINQ ограничений SQL, вы можете использовать LINQ для SQL, а затем LINQ к объектам:

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(); 
Смежные вопросы