C# 有没有更好的方法来实现这个Linq查询和函数?

C# 有没有更好的方法来实现这个Linq查询和函数?,c#,linq,list,linq-to-sql,C#,Linq,List,Linq To Sql,我让这个方法从数据库中检索记录。如您所见,我想返回一个列表,其中ITieneID是在我的业务层上定义的接口 AtlasWFM_Entities.Clases.Area实现该接口。很明显,这并不是一个实现这一目标的好方法。代码如下: public override List<ITieneID> Buscar(ITieneID elementoPatron) { List<ITieneID> result = new 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;
    }
公共覆盖列表总线车(ITieneID elementoPatron)
{
列表结果=新列表();
var resultado=来自base.Repository.Context.Areas中的
其中a.areaID.Equals(elementoPatron.ID)| a.AreaDescription.Contains(elementoPatron.Description)
选择new AtlasWFM_Entities.Clases.Area
{
ID=a.areaID,
description=a.区域description,
Estado=a.areaEstado,
};
foreach(resultado中的var r)
{
ITieneID t=新AtlasWFM_Entities.Clases.Area
{
ID=r.ID,
描述=r.描述,
Estado=r.Estado,
};
结果:添加(t);
}
返回结果;
}

有什么改进的方法吗?

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

如果区域实现了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;
公共覆盖列表总线车(ITieneID elementoPatron)
{ 
var resultado=来自base.Repository.Context.Areas中的
其中a.areaID.Equals(elementoPatron.ID)| a.AreaDescription.Contains(elementoPatron.Description)
选择new AtlasWFM_Entities.Clases.Area
{ 
ID=a.areaID,
description=a.区域description,
Estado=a.areaEstado,
}; 
返回新列表(resultado);
}
更新:不编译,但应该:

        return new List<ITieneID>(resultado.Cast<ITieneID>()); 
返回新列表(resultado.Cast());
事实上,我认为你可以把整个事情简化为:

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>()); 
   }
公共覆盖列表总线车(ITieneID elementoPatron)
{ 
var resultado=来自base.Repository.Context.Areas中的
其中a.areaID==elementoPatron.ID | | a.AreaDescription.Contains(elementoPatron.Description)
选择一个;
返回新列表(resultado.Cast());
}
更简洁一点:

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>()); 
}
公共覆盖列表总线车(ITieneID elementoPatron)
{ 
返回新列表(base.Repository.Context.Areas
其中(a=>a.areaID==elementoPatron.ID | | a.areaDescription.Contains(elementoPatron.Description))
.Cast());
}
公共覆盖列表总线(ITieneID elementoPatron)
{ 
var resultado=来自base.Repository.Context.Areas中的
其中a.areaID.Equals(elementoPatron.ID)| a.AreaDescription.Contains(elementoPatron.Description)
选择new AtlasWFM_Entities.Clases.Area
{ 
ID=a.areaID,
description=a.区域description,
Estado=a.areaEstado,
}; 
返回新列表(resultado);
}
更新:不编译,但应该:

        return new List<ITieneID>(resultado.Cast<ITieneID>()); 
返回新列表(resultado.Cast());
事实上,我认为你可以把整个事情简化为:

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>()); 
   }
公共覆盖列表总线车(ITieneID elementoPatron)
{ 
var resultado=来自base.Repository.Context.Areas中的
其中a.areaID==elementoPatron.ID | | a.AreaDescription.Contains(elementoPatron.Description)
选择一个;
返回新列表(resultado.Cast());
}
更简洁一点:

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>()); 
}
公共覆盖列表总线车(ITieneID elementoPatron)
{ 
返回新列表(base.Repository.Context.Areas
其中(a=>a.areaID==elementoPatron.ID | | a.areaDescription.Contains(elementoPatron.Description))
.Cast());
}

好的,如果您需要在两个“跃点”中完成此操作,以解决任何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();

好的,如果您需要在两个“跃点”中完成此操作,以便解决任何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();

我怀疑LinqtoSQL不会喜欢在这里使用Area类——我认为对您可以构建的类型有限制。不过我可能错了。John,OP已经在使用它了-只有OP得到了一组区域,然后出于某种脚本原因使用它来实例化另一组区域。我怀疑LINQ to SQL不会喜欢在这里使用Area类-我认为对您可以构建的类型有限制。我可能是错的。John,OP已经使用了它-只有OP得到了一组区域,然后出于某种脚本原因用它来实例化另一组区域。@Nix,这一个不起作用,因为ConvertAll只是列表类型的扩展,不适用于IQueryable。谢谢现在正在编译,我希望也能起作用。谢谢你,朋友@Nix,这个不起作用,因为ConvertAll只是列表类型的扩展,而不是IQueryable的扩展。谢谢,现在正在编译,我希望也能起作用。谢谢你,朋友!