![](/img/trans.png)
[英]using Single/First methods to return multiple values in linq or lambda expression
[英]How to return multiple rows using LINQ lambda expression from SQL Server 2014?
我正在尝试使用LINQ lambda表达式从SQL Server 2014中获取数据,这是我的项目的要求。 但是,由于我是LINQ的新手,所以我认为这里的代码在做错事情,并且遇到了错误。
我只能读取一行而没有任何错误,但是如果我把条件提取到多行中,那么我会报错。
这是我的代码-这是存储库类:
public DettagliModel GetByIdDoc(int id)
{
using (var dbCtx = new USDevEntities())
{
var dettagli = dbCtx.Dettaglis.Where(x => x.IDDoc == id);
if (dettagli != null)
{
return ConvertTo(dettagli); // Getting error here
}
else
{
return null;
}
}
}
public DettagliModel ConvertTo(Dettagli entity)
{
var model = Mapper.Map<DettagliModel>(entity);
return model;
}
我收到此错误:
参数1:无法从“ System.Linq.IQueryable”转换为“ DAL.Service.Entity.Dettagli” Core.Service
编写代码时遇到此错误,但如果我把
.Where(x => x.IDDoc == id).FirstOrDefault();
然后错误消失。
请建议我该怎么做才能解决此问题,因为我需要获取多行,所以无法使用FirstOrDefault()
方法。 谢谢。
Where
扩展方法返回IQueryable<T>
这意味着它是一个以上的元素。 如果要使用Automapper将多个实体映射到其他模型,则建议您使用ProjectTo<T>
扩展方法:
public IEnumerable<DettagliModel> ConvertTo(IQueryable<Dettagli> entities)
{
return entities.ProjectTo<DettagliModel>().ToList();
}
public IEnumerable<DettagliModel> GetByIdDocs(int id)
{
using (var dbCtx = new USDevEntities())
{
return ConvertTo(dbCtx.Dettaglis.Where(x => x.IDDoc == id));
}
}
首先,它永远不会为空:
var dettagli = dbCtx.Dettaglis.Where(x => x.IDDoc == id);
另外,当某些东西是IEnumerable<T>
时,请不要返回null
,而应使用Enumerable.Empty<T>()
。
现在,您的方法看起来将返回单个DettagliModel
,由ConvertTo
从单个Dettagli
创建。
您可能需要将返回类型更改为IEnumerable<DettagliModel>
这样,您现在就可以使用.Select
将数据库实体投影到您自己的类型中:
return
dettagli.Select(d => ConvertTo(d));
//or just dettagli.Select(ConvertTo); if you like.
这将是一个懒惰的集合,所以我可能会在最后使用.ToList()
(然后是.AsReadOnly()
或使用.ToArray()
YMMV)将其转换为非懒惰的.ToList()
。
.Where(x => x.IDDoc == id).ToList();
返回List<dbCtx.Dettaglis>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.