Есть ли лучший способ сделать этот запрос и функцию Linq? - PullRequest
0 голосов
/ 01 апреля 2010

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

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

Есть идеи, как это улучшить?

Ответы [ 3 ]

1 голос
/ 01 апреля 2010
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); 
   }

ОБНОВЛЕНИЕ: Это не компилируется, но это должно:

        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>()); 
}
1 голос
/ 01 апреля 2010

Что ж, если вам нужно сделать это за два «прыжка», чтобы обойти ограничения LINQ to SQL, вы можете использовать LINQ to SQL, а затем 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();
1 голос
/ 01 апреля 2010

Если Area реализует интерфейс 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...