2010-09-10 2 views
1

Я хочу создать динамический запрос для проверки управления, где положение с числом параметров, доступных ... если какой-то параметр является нулевым, я не хочу, чтобы включить его в пункт, гдепомощью, если еще с LINQ Где

var test = from p in _db.test 
      where if(str1 != null){p.test == str} else i dnt wanna check p.test 

у меня есть около 14 параметров, где положение

нужна помощь, благодаря

ответ

5

Вы можете сделать это в шагах:

// set up the "main query" 
var test = from p in _db.test select _db.test; 
// if str1 is not null, add a where-condition 
if(str1 != null) 
{ 
    test = test.Where(p => p.test == str); 
} 
+0

Обратите внимание, что иногда вы не сможете использовать 'var' здесь, потому что тип времени компиляции '_db.test' может быть более специфичным, чем' IEnumerable ', возвращенный' Where'. Также обратите внимание, что вы не можете использовать только «из p in _db.test» самостоятельно;) –

+0

У меня есть около 14 параметров для предложения where .. это означает, что я должен проверять каждый параметр ... есть ли любой способ сделать этот запрос динамическим, что, если несколько параметров равны нулю :) – Hasan

+0

@Jon: ha, я был немного отвлечен при записи, поэтому забыл выбрать. Спасибо, что указали это. –

1

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

var test = from p in _db.test 
      where str1 == null || p.test == str1; 

Редактировать Если у вас есть много строк, чтобы проверить, (str1, str2, и т.д ...), то вы можете использовать следующую команду, которая будет переведена на SQL IN пункта:

var strings = new List<string>(); 
if (str1 != null) strings.Add(str1); 
if (str2 != null) strings.Add(str2); 
if (str3 != null) strings.Add(str3); 
... 

var test = from p in _db.test 
      where strings.Contains(p.test); 

Это даже проще, если ваши строки уже находятся в коллекции (который, если вы получили 14 из их, я предположим, что они будут ...)

+0

Если str1 == null Я не хочу проверять p.test ... и у меня есть 14 строк – Hasan

+0

любые предложения? – Hasan

+1

@ Хасан: это именно то, что пишет @Dean: если 'str == null',' p.test == str1' не будет проверяться. –

1

Рассмотрим параметры param1 и param2 - параметры. Ваш запрос должен быть как под:

string param1 = "Value1"; 
string param2 = "Value2"; 

var q = from bal in context.FxBalanceDetails 
     where (string.IsNullOrEmpty(param1) || bal.Column1 == param1) 
       && (string.IsNullOrEmpty(param2) || bal.Column2 == param2) 
     select bal; 

Это гарантирует, что где положение будет применяться для конкретного параметра только тогда, когда оно не равно нулю.

+0

Я был бы осторожен, делая все в одном месте. Я думаю, если ваш провайдер linq (EF, L2S, NH и т. Д.) Не сможет преобразовать что-то внутри предложения where в SQL, вы, вероятно, в конечном итоге потянете всю таблицу в память. – Ryan

+0

Да, я понимаю.Иногда LINQ может генерировать довольно неприятный SQL. Я использовал этот метод в SP очень успешно. –

0

Вы проверяете строки против одного и того же поля объекта? Если так что вы можете написать что-то вроде:

var strings = new[] { "foo", "bar", "ok", "", null }; 
var query = dataContext.YourTable.AsQueryable(); 
query = strings.Where(s => !string.IsNullOrEmpty(s)) 
     .ToList() 
     .Aggregate(query, (q, s) => q.Where(e => e.YourField == s)); 

EDIT: Предыдущее решение усложненной:

var strings = new[] { "foo", "bar", "ok", "", null }.Where(s => !string.IsNullOrEmpty(s)) 
     .ToList(); 
var query = dataContext.YourTable.Where(e => strings.Contains(e.YourField)); 
Смежные вопросы