Есть ли в Linq метод, с помощью которого вы можете создавать строки SQL, такие как «... where (a = 1) OR (a = 2)»?
Ответы:
Вы, безусловно, можете сделать это в предложении Where (метод расширения). Однако, если вам нужно динамически построить сложный запрос, вы можете использовать PredicateBuilder .
var query = collection.Where( c => c.A == 1 || c.B == 2 );
Или используя PredicateBuilder
var predicate = PredicateBuilder.False<Foo>();
predicate = predicate.Or( f => f.A == 1 );
if (allowB)
{
predicate = predicate.Or( f => f.B == 1 );
}
var query = collection.Where( predicate );
Вы можете использовать стандартные логические операторы .NET в своем единственном предложении where:
MyDataSource.Where(data => data.a == 'a' || data.a == 'b')
в .Where()
вызове используйте стандартный логический оператор "ИЛИ" ||
.
var query = items.Where(item => (item == 1 || item == 2));
Все, что выполняет вызов Where, - это логическое сравнение всего, что вы хотите, поэтому вы можете заполнить его любым количеством условной логики.
Если вы не знаете количество параметров, вы можете использовать это:
Пример данных
var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
sampledata["a"] = "A";
sampledata["b"] = "B";
sampledata["c"] = "C";
sampledata["d"] = "D";
Код
var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();
Теперь это встроено в .net, не уверен, что это было раньше. Учитывая существующий запрос Linq, вы можете добавить предложение where, которое принимает массив строк (SearchStrings), и проверить, соответствует ли какая-либо из них любому объекту в коллекции, которую вы ищете. Использование ToLower () просто гарантирует, что вы избегаете чувствительности к регистру в запросах SQL.
query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));
Вы можете сделать то же самое для предиката 'and', сопоставив все слова в массиве с объектом коллекции.
query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));
В этом примере i коррелирует с каждым объектом в коллекции, а s коррелирует с каждой строкой в массиве SearchStrings.
||
и хотите чего-то динамичного, напримерa=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);
. Вы можете заявить об этом более четко ...