【问题标题】:How to get specific column in Entity Framework如何在实体框架中获取特定列
【发布时间】:2019-08-02 19:48:57
【问题描述】:

我有一个product 表。我想从此表中获取特定列(仅名称和价格列),但出现错误。我做错了什么?

总结一下,我想写

SELECT name, surname 
FROM Product 
WHERE name='emre'

但在我的基于实体框架的代码中。

public class products
{
    public int ID { get; set; }
    public string name { get; set; }
    public decimal price { get; set; }
    public int stock { get; set; }
}

public class EtradeContext:DbContext
{
    public DbSet<products> prdcts { get; set; }
}

我的 ProductDal.cs 如下:

    public List<products> GetNameAndPrice()
    {
        using (EtradeContext context = new EtradeContext())
        {

            var result = (from x in context.prdcts
                          where x.name == "emre"
                          select new products
                          {
                              name = x.name,
                              price=x.price

                          }).ToList();
            return result;
        }
    }

我收到了this error

【问题讨论】:

  • 错误是因为您试图将查询结果投影到您为 Dbcontext 定义为 Dbset 的同一实体,这意味着您不能使用实体来投影您用于 DbSet 的查询结果
  • 所以你需要视图模型来收集查询结果。所以创建一个视图模型意味着新类名称为productsViewModel 并将所有属性从products 复制到新的,然后将方法返回类型更改为List 并将您的结果投影到新的select new productsViewModel {}
  • 谢谢@er-sho。它的工作:)
  • @EnginOzsozgun,很高兴听到并欢迎 :)

标签: c# asp.net .net entity-framework linq


【解决方案1】:

您不能将结果投影到同一实体。您可以做的是使用匿名类型,例如DTOViewModel 或类似的东西。但是在选择中使用与 DBSet 中相同的类会产生错误:

var result = (from x in context.prdcts
              where x.name == "emre"
              select new ProductDTO
                      {
                          name = x.name,
                          price = x.price
                      }).ToList();

【讨论】:

    【解决方案2】:

    使用此代码:

    public class ProductDTO
    {
        public string Name { get; set; }
        public string Price{ get; set; }
    }
    
      public List<ProductDTO> GetNameAndPrice()
        {
            using (EtradeContext db= new EtradeContext())
            {
            return (from p in db.prdcts
                where p.name == "emre"
                select new ProductDTO { Name = p.name,Price = p.price }).ToList();
            }
        }
    

    【讨论】:

      【解决方案3】:

      你也可以试试这个方法。
      它清晰且经过优化。

       using (EtradeContext context = new EtradeContext())
          {
      
              var result = context.prdcts
                  .Where(x => x.name == "emre")
                  .Select(s => new
                  {
                      name = s.name
                      ,
                      price = s.price
                  }).ToList();
      
              return result;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多