Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用SQL Server 2014中的LINQ lambda表达式返回多行?_C#_Sql Server_Entity Framework_Linq_Automapper - Fatal编程技术网

C# 如何使用SQL Server 2014中的LINQ lambda表达式返回多行?

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())

我正在尝试使用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;
    }
然后错误就消失了


请建议我如何解决此问题,因为我需要获取多行,因此无法使用
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();