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

本文关键字:类型 返回 何使用 方法 | 更新日期: 2023-09-27 18:31:29

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

我的表如下所示:

客户表

  • 客户编号
  • 客户名称

订单表

  • 订单编号
  • 客户 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>();
    }
}

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

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

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

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 这是最佳实践检查,
有没有办法从方法返回匿名类型?
返回匿名类型结果?
顺便说一下,Dto 代表数据传输对象

我看到的问题是您正在选择匿名类型,您不能这样做:

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