C# 如何使用SQL Server 2014中的LINQ lambda表达式返回多行?
我正在尝试使用LINQ lambda表达式从SQL Server 2014获取数据,这是我的项目的要求。但是,由于我是LINQ的新手,我认为我在这里的代码有问题,我得到了一个错误 我只能获取一行而没有任何错误,但若我设置了获取多行的条件,那个么我就得到了错误 这是我的代码-这是存储库类:C# 如何使用SQL Server 2014中的LINQ lambda表达式返回多行?,c#,sql-server,entity-framework,linq,automapper,C#,Sql Server,Entity Framework,Linq,Automapper,我正在尝试使用LINQ lambda表达式从SQL Server 2014获取数据,这是我的项目的要求。但是,由于我是LINQ的新手,我认为我在这里的代码有问题,我得到了一个错误 我只能获取一行而没有任何错误,但若我设置了获取多行的条件,那个么我就得到了错误 这是我的代码-这是存储库类: public DettagliModel GetByIdDoc(int id) { using (var dbCtx = new USDevEntities())
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;
}
然后错误就消失了
请建议我如何解决此问题,因为我需要获取多行,因此无法使用
FirstOrDefault()
方法。谢谢。首先,它永远不会为空:
var dettagli = dbCtx.Dettaglis.Where(x => x.IDDoc == id);
另外,当某个内容是IEnumerable
时,不要返回null
,请使用Enumerable.Empty()
现在,您的方法将返回一个
DettagliModel
,它是ConvertTo
从一个Dettagli
创建的
您可能需要将返回类型更改为IEnumerable
这样,您现在就可以使用。选择将数据库实体投影到您自己的类型中:
return
dettagli.Select(d => ConvertTo(d));
//or just dettagli.Select(ConvertTo); if you like.
这将是一个惰性集合,因此我可能会最终使用.ToList()
将其转换为非惰性集合(后面是.AsReadOnly()
或使用.ToArray()
YMMV)。其中
扩展方法返回一个IQueryable
,这意味着它是多个元素。如果您想使用Automapper将多个实体映射到不同的模型,那么我建议您使用扩展方法:
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));
}
}
public IEnumerable ConvertTo(IQueryable实体)
{
返回entities.ProjectTo().ToList();
}
公共IEnumerable GetByIdDocs(int-id)
{
使用(var dbCtx=new USDevEntities())
{
返回ConvertTo(dbCtx.Dettaglis.Where(x=>x.IDDoc==id));
}
}
返回列表
您在使用automapper吗?是的,我正在使用它。我已将该标记包含在您的问题中,因为它是相关的。谢谢@octaviocclThanks的回答。我已经尝试了您的代码,但是ProjectTo()行显示的错误是“不包含ProjectTo的定义”。您能告诉我如何实现这个吗?您需要添加名称空间。我不记得名字了。使用AutoMapper.QueryableExtensions等待一秒钟代码>
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));
}
}
.Where(x => x.IDDoc == id).ToList();