2012-04-18 144 views
2

我有一个简单的数据库,使用EF数据模型来处理。如何使用从方法返回的匿名类型

我的表是这样的:

客户表

  • 客户编号
  • 客户名称

Orders表

  • 的OrderId
  • 客户ID FK
  • 订购日期

我使用一个辅助类来查询我的模型,并在这个类中,我有以下查询:

public static List<object> GetCustomerOrdersCount() 
{ 
    using (OrdersDbEntities context = new OrdersDbEntities()) 
    { 
     return context.Customers.Select(
      c => new 
      { 
       CustId = c.CustomerId, 
       CustName = c.CustomerName, 
       OrdersCount = c.Orders.Count 
      }).ToList<object>(); 
    } 
} 

的唯一回报I型可以用这种方法使用是List<object>

最后我的问题是:如何做我使用从这个查询中收到的数据?

我可以读出的值的唯一方法是通过反射:

List<object> custs = Dal.GetCustomerOrdersCount(); 

foreach (var customer in custs) 
{ 
    var properties = customer.GetType().GetProperties(); 

    foreach (var data in properties) 
    { 
     var value = data.GetValue(custs[0], null); 
    } 
} 

我不知道是否有更好的方法来做到这一点。

+2

为什么您使用的对象,而不是客户?我假设context.Customers是客户的DbSet? – Maess 2012-04-18 19:31:32

+0

这是我在尝试返回列表时得到的错误:System.Linq。IQueryable '不包含'ToList'的定义和最好的扩展方法重载'System.Linq.ParallelEnumerable.ToList (System.Linq.ParallelQuery )'有一些无效参数 – Yoav 2012-04-18 19:34:58

+0

请发布代码OrdersDbEntities – Maess 2012-04-18 19:36:37

回答

1

,我看到的问题是,你选择一个匿名类型,你不能做的:

public static List<object> GetCustomerOrdersCount() 
{ 
     using (OrdersDbEntities context = new OrdersDbEntities()) 
     { 
      return context.Customers.Select().ToList<Customer>(); 
     } 
} 

,将返回您的完整Customer实体,而不是只包含特定的成员匿名类型。

编辑

如果底层的问题,关于我们对延迟加载的谈话,是要令给定客户的数量的计数,而无需实际加载的订单,那么我会做这样的事情:

public class CustomerWithOrderCount 
{ 
    public CustomerWithOrderCount(Customer c, int OrderCount) 
    { 
     Customer = c; 
     this.OrderCount = OrderCount; 
    } 
    public Customer { get; set; } 
    public int OrderCount { get; set; } 
} 

public static List<object> GetCustomerOrdersCount() 
{ 
     using (OrdersDbEntities context = new OrdersDbEntities()) 
     { 
      return context.Customers.Select(
       c => new CustomerWithOrderCount(c, c.Orders.Count()) 
          .ToList(); 
     } 
} 
+0

这是我在尝试执行您的建议时得到的错误:ObjectContext实例已被处置,不能再用于需要连接的操作。我想我可以做这样的事情:return context.Customers.Include(“Orders”)。ToList ();但是这会带来很多不必要的数据...... – Yoav 2012-04-18 19:45:39

+0

是的,你可能试图做延迟加载。如果你想这样做,你需要保留用于加载实体的上下文,以便实体可以使用上下文从数据库中获取数据。否则使用'.Include()'或'.LoadProperty()'来加载额外的数据是最好的方法。 – CodingGorilla 2012-04-18 19:48:07

+0

或者我可以继续使用反射:)我会尝试查找你提到的这个懒加载的东西 – Yoav 2012-04-18 20:00:34

2
public class MiniCustomerDto 
{ 
    public int CustomerId{get;set;} 
    public String CustomerName{get;set;} 
    public int OrdersCount{get;set;} 
} 

public static List<MiniCustomerDto> GetCustomerOrdersCount() 
{ 
     using (OrdersDbEntities context = new OrdersDbEntities()) 
     { 
      return context.Customers.Select(c => new MiniCustomerDto 
      { 
       CustId = c.CustomerId, 
       CustName = c.CustomerName, 
       OrdersCount = c.Orders.Count 
      }).ToList(); 
     } 
} 

你必须使用类,你不能创建返回匿名类型
ABD这是最好的做法通道的方法埃克
Is there a way to return Anonymous Type from method?
Return anonymous type results?
的方式DTO代表数据传输对象

0
List<tbl_GameConfig> gameConfig = new List<tbl_GameConfig>(); 
using (Entities con = new Entities()) 
    { 
     gameConfig = con.tbl_GameConfig.Where(p => p.fk_GameTypeId == gameTypeId).ToList<tbl_GameConfig>(); 
    }