Используйте Any() и Count() в Dynamic Linq

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


person ArpanDesai    schedule 29.06.2011    source источник
comment
Возможно, это должно быть Orders.Count(ShipVia==2)   -  person boca    schedule 29.06.2011
comment
@boca: внутренний запрос будет преобразован непосредственно в SQL, я думаю, где оператор условия =, а не ==   -  person abatishchev    schedule 29.06.2011


Ответы (3)


Если вам НЕОБХОДИМО использовать Dynamic Linq, ваш запрос должен выглядеть так:

db.Customers.Where("Orders.Count(ShipVia == 2) > 3");
person ITmeze    schedule 31.01.2014

Как насчет чего-то подобного.

IQueryable<Customer> test = db.Customers.Where(c => c.Orders.Where(o => o.ShipVia ==2).Count() >2);
person boca    schedule 29.06.2011
comment
На самом деле я использую библиотеку расширений Linq Dynamic. Поэтому мне нужно передать строковый запрос внутри Where(). И я не могу преобразовать это лямбда-выражение в строковый запрос. - person ArpanDesai; 29.06.2011
comment
Как насчет db.Customers.Where(Orders.Count(ShipVia=2) › 3) - person boca; 29.06.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() };

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

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

person The Evil Greebo    schedule 29.06.2011