网格显示TypeProducts为空,我不想使用匿名类型,如new {}

时间:2015-12-01 15:02:42

标签: c# entity-framework linq linq-to-entities entity-framework-6

 public class GridData
    {
        public static IList gridDatos()
        {
            {
                using (EnterpriseEntities dbcontext = new EnterpriseEntities())
                {
                       var _products = dbcontext.Products.
                        Include(c => c.TypeProducts).ToList();
                    return _products;
                }
            }
        }
   }

1 个答案:

答案 0 :(得分:0)

您忘记在方法的返回类型部分中指定要返回的public static IList<Product> gridDatos() { using (var dbcontext = new EnterpriseEntities()) { var _products = dbcontext.Products. Include(c => c.TypeProducts).ToList(); return _products; } } 类型。

public class ProductDto
{
  public int Id {set;get;}
  public string Name {set;get;}
  public List<TypeProductDto> Types {set;get;}
}           
public class TypeProductDto 
{
  public class string TypeName {set;get; }
}

或者您有DTO&POCCO / ViewModel,您可以在LINQ表达式中对其进行投影,以确保您只对数据库执行一次查询。如果没有,如果您在剃刀视图中迭代Product集合并尝试访问其他类型的Navgation属性,它将再次为那里的每个唯一记录执行查询。阅读有关延期执行的更多信息here

所以,让我们说你有像这样的DTO

public static List<ProductDto> GetProducts()
{
    using (var dbcontext = new EnterpriseEntities())
    {
         var _products = dbcontext.Products.
                        Select(x=> new ProductDto
                           {  Id =x.Id, 
                              Name =x.Name,
                              Types= x.TypeProducts
                                       .Select(t=>new TypeProductDto
                                                  { Name =x.Name})
                           }).ToList();
         return _products;
    }
}

因此,在您的LINQ表达式中,将结果投影到我们的新DTO

{{1}}

这将只执行一个查询并将结果映射到DTO。