有没有更好的方法来做这个Linq查询和功能?

时间:2010-04-01 14:26:55

标签: c# linq list linq-to-sql

我正在使用此方法从数据库中检索记录。如您所见,我想返回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 个答案:

答案 0 :(得分:1)

如果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;

答案 1 :(得分: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); 
   }

更新:不编译,但应该:

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

答案 2 :(得分:1)

好吧,如果您需要在两个“跳”中执行此操作以解决任何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();