Используйте Any () и Count () в динамическом Linq - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь написать динамический запрос библиотеки 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. Предложите мне способ реализовать это.

Ответы [ 4 ]

2 голосов
/ 31 января 2014

Если вы должны использовать Dynamic Linq, ваш запрос должен выглядеть следующим образом:

db.Customers.Where("Orders.Count(ShipVia == 2) > 3");
1 голос
/ 29 июня 2011
var grp = db.Customers.Where("ShipVia=2").GroupBy("ShipVia");

var test = from a in grp
             where a.Count() > 3
             select a.Key;  
1 голос
/ 29 июня 2011
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() };

Не проверено, но я считаю, что все это должно делаться в одном утверждении, при условии, что Заказы - это совокупность внутри Клиента.

Обратите внимание, что ваш одиночный = в предложении where очень опасен, так как он назначит 2 всем шипам вместо вместо (==)

1 голос
/ 29 июня 2011

Как насчет этого?

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