2

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

我的表如下所示:

客户表

  • 客户ID
  • 顾客姓名

订单表

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

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

4

3 回答 3

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

于 2012-04-18T20:08:15.290 回答
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();
        }
}
于 2012-04-18T19:38:31.337 回答
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>();
  }       
于 2013-01-24T10:26:18.363 回答