【问题标题】:Use Any() and Count() in Dynamic Linq在 Dynamic Linq 中使用 Any() 和 Count()
【发布时间】:2011-06-29 14:24:44
【问题描述】:

我正在尝试编写动态 Linq 库查询以按条件获取记录, 订单数大于 3 且 ShipVia 字段等于 2 的客户。

以下是我尝试过的语法。

object[] objArr = new object[10];
objArr[0] = 1;
IQueryable<Customer> test = db.Customers.Where("Orders.Count(ShipVia=2)", objArr);

IQueryable<Customer> test = db.Customers.Where("Orders.Any(ShipVia=2).Count()", objArr);

但两者都不起作用。在第二个查询中,Any 返回 true,因此它不适用于 Count。 建议我一种方法来实现这一点。

【问题讨论】:

  • 也许应该是“Orders.Count(ShipVia==2)”
  • @boca:内部查询会直接转成SQL,我猜,条件运算符是=,不是==

标签: c# asp.net linq linq-to-sql dynamic-linq


【解决方案1】:

如果您必须使用 Dynamic Linq,您的查询应该如下所示:

db.Customers.Where("Orders.Count(ShipVia == 2) > 3");

【讨论】:

    【解决方案2】:

    这样的事情怎么样。

    IQueryable<Customer> test = db.Customers.Where(c => c.Orders.Where(o => o.ShipVia ==2).Count() >2);
    

    【讨论】:

    • 其实我正在使用 Linq 动态扩展库。所以我必须在 Where() 中传递基于字符串的查询。而且我无法将此 lambda 表达式转换为基于字符串的查询。
    • db.Customers.Where("Orders.Count(ShipVia=2) > 3") 怎么样
    【解决方案3】:
    var grp = db.Customers.Where("ShipVia=2").GroupBy("ShipVia");
    
    var test = from a in grp
                 where a.Count() > 3
                 select a.Key;  
    

    【讨论】:

      【解决方案4】:
      IQueryable<Customer> test = 
          from c in db.Customers
          from o in c.Orders
          where o.ShipVia == 2 // NOTE you need == not = for compare
          group c by c into grp
          select new {customer = grp.key, ordercount = grp.Count() };
      

      未经测试,但我认为这应该在一个语句中完成,假设 Orders 是 Customer 中的一个集合。

      请注意,您的 where 子句中的单个 = 非常危险,因为它会将 2 分配给所有 Shipvias 而不是 test (==)

      【讨论】:

        猜你喜欢
        • 2019-07-27
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多