2011-06-29 3 views
2

Я пытаюсь написать динамический запрос Linq библиотеки для извлечения записи при условии, Клиентов, у кого есть количество заказов больше 3 и ShipVia поля равного 2.Используйте любого() и Count() в динамическом Linq

Ниже мой синтаксис, что я пробовал.

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

+0

Может быть, это должно быть "Orders.Count (ShipVia == 2)" – boca

+0

@boca: внутренний запрос будет преобразован непосредственно в SQL, я думаю, где оператор условие =, а не == – abatishchev

+0

Понял , Ничего ... – boca

ответ

1

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

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

На самом деле я использую Linq Dynamic library. Поэтому я должен передать запрос на основе строки внутри Where(). И я не могу преобразовать это лямбда-выражение в строковый запрос. – ArpanDesai

+0

Как насчет db.Customers.Where ("Orders.Count (ShipVia = 2)> 3") – boca

1
var grp = db.Customers.Where("ShipVia=2").GroupBy("ShipVia"); 

var test = from a in grp 
      where a.Count() > 3 
      select a.Key; 
1
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() }; 

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

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

2

Если вы должны использовать динамические Linq, ваш запрос должен выглядеть так :

db.Customers.Where("Orders.Count(ShipVia == 2) > 3"); 
Смежные вопросы