我正在使用此方法从数据库中检索记录。如您所见,我想返回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;
}
任何想法如何改善这个?
答案 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();