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的扩展。谢谢,现在正在编译,我希望也能起作用。谢谢你,朋友!