如何使用从方法返回的匿名类型

时间:2012-04-18 19:27:59

标签: c# linq entity-framework

我使用的是一个简单的数据库,可以使用EF数据模型。

我的表格如下:

客户表

  • 客户ID
  • 客户名称

订单表

  • 的OrderId
  • CustomerID 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>();
    }
}

我可以使用此方法的唯一返回类型是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);
   }
}

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

3 个答案:

答案 0 :(得分: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代表数据传输对象

答案 1 :(得分: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();
        }
}

答案 2 :(得分: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>();
  }