【问题标题】:How to return multiple rows using LINQ lambda expression from SQL Server 2014?如何使用 SQL Server 2014 中的 LINQ lambda 表达式返回多行?
【发布时间】:2016-10-24 21:16:43
【问题描述】:

我正在尝试使用 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() 方法。谢谢。

【问题讨论】:

  • 你在使用自动映射器吗?
  • 是的,我正在使用它。
  • 我在你的问题中包含了这个标签,因为它是相关的
  • 谢谢@octavioccl

标签: c# sql-server entity-framework linq automapper


【解决方案1】:

Where 扩展方法返回一个IQueryable&lt;T&gt;,这意味着它不止一个元素。如果你想使用 Automapper 将多个实体映射到不同的模型,那么我建议你使用ProjectTo&lt;T&gt; 扩展方法:

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

    }

}

【讨论】:

  • 感谢您的回答。我已经尝试过您的代码,但 ProjectTo() 行显示错误“不包含 ProjectTo 的定义”。你能告诉我我是如何实现的吗?
  • 你需要添加命名空间。我不记得名字了。等一下
  • using AutoMapper.QueryableExtensions;
【解决方案2】:

首先,这永远不会为空:

var dettagli = dbCtx.Dettaglis.Where(x => x.IDDoc == id);

另外,当某些东西是IEnumerable&lt;T&gt; 时不要返回null,使用Enumerable.Empty&lt;T&gt;()


现在,您的方法看起来返回单个 DettagliModelConvertTo 从单个 Dettagli 创建。

您可能需要将返回类型更改为IEnumerable&lt;DettagliModel&gt;

这样一来,您现在就可以使用.Select 将数据库实体投影到您自己的类型中:

return
    dettagli.Select(d => ConvertTo(d)); 
    //or just dettagli.Select(ConvertTo); if you like.

这将是一个惰性集合,所以我可能会在最后使用.ToList() 将其转换为非惰性集合(然后是.AsReadOnly() 或使用.ToArray() YMMV)。

【讨论】:

    【解决方案3】:
    .Where(x => x.IDDoc == id).ToList();
    

    返回List&lt;dbCtx.Dettaglis&gt;

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多