Динамическое предложение where в Linq to Entities - PullRequest
10 голосов
/ 03 февраля 2012

Я использую linq для сущностей (EF). У меня есть конструктор, который принимает 4 строковых параметра. В зависимости от того, какой параметр не является нулевым, я должен построить запрос linq. Я могу делать с инструкциями if else, но у меня также есть другой конструктор с 10 параметрами, в этом случае будет много комбинаций для проверки.

Пример:

Constructor(p1,p2,p3,p4)
{
  var prod= from p in ctxt.products.expand("items\details")
            where p.x==p1 && p.xx==p2 && p.xxx==p3 && p.xxxx==p4
            select p;
}

В приведенном выше предложении where проверки условий должны выполняться только в том случае, если параметр не равен NULL. то есть., если p2 равно нулю, то выражение where должно выглядеть как

where p.x==p1 && p.xxx==p3 && p.xxxx==p4

если p2 и p3 равны нулю, то

where p.x==p1 && p.xxxx==p4

Может кто-нибудь сказать мне, как справиться с этим. если возможно, можете дать пример кода для этого

Ответы [ 3 ]

11 голосов
/ 03 февраля 2012

Linq's DeferredExecution для спасения.Запрос Linq не выполняется, если от него не запрашиваются данные.

var prod = from p in ctxt.products.expand("items\details")
        select p;

if (p1 != null)
{
    prod = prod.Where(p => p.x == p1);
}

if (p2 != null)
{
    prod = prod.Where(p => p.xx == p2);
}

// Execute the query

var prodResult = prod.ToList();
3 голосов
/ 03 февраля 2012

Вы всегда можете построить запрос по частям и воспользоваться задержкой выполнения запроса:

public Constructor(int? p1, int? p2, int? p3, int? p4)
{
    var prod = ctxt.products.expand("items\details");

    if(p1 != null)
        prod = prod.Where(p.x == p1);

    if(p2 != null)
        prod = prod.Where(p.xx == p2);

    if(p3 != null)
        prod = prod.Where(p.xxx == p3);

    if(p4 != null)
        prod = prod.Where(p.xxxx == p4);
}
3 голосов
/ 03 февраля 2012

При необходимости вы можете связать методы:

 YourType(string p1, string p2, string p3, string p4)
 {
      var prod = ctxt.Products.Expand("items\details");

      if (!p1.IsNullOrWhiteSpace())
          prod = prod.Where(p => p.x == p1);
      if (!p2.IsNullOrWhiteSpace())
          prod = prod.Where(p => p.xx == p2);

      // ....

      // use "prod"
 }

Результирующий SQL должен быть таким же, как если бы вы поместили их все в один оператор.

...