gani7787 Ответов: 3

Как использовать оператор like в запросе linq


Привет,

Как использовать оператор like в linq. у меня есть нижеприведенная таблица.

я просто хочу отфильтровать и получить записи, как показано ниже.

"где" Temp содержит" ("S1, S2") ==> Я хочу отфильтровать все S1 и S2 по целым столбцам.

также я хочу eleminate "where Temp not in like (%Fi%,%K%) records.

Как мы пишем в LINQ Query.

пример таблицы ниже.
Emp	Temp
100	S1+S2+S3
100	S1+S2+S3
100	S1+S2+S3
100	S1+S2+S3
100	S1+S2+S3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	Z1+Z2+Z3
100	S1+Z3
100	L1+L2
100	L1+L2
100	A+B
100	C+DD
100	EE+Fin
100	Ke+W


Что я уже пробовал:

Values = "A1,A2"
Var query1 = (from a in tbl1.AsEnumerable()

                     where r.Field<string>("TEMP").Contains(Values)

3 Ответов

Рейтинг:
0

Maciej Los

Предполагая, что tbl1 является ли объект datatable объектом, вы должны объединить Where + Any метод.

Итак, взгляните на пример и измените свой запрос в соответствии с вашими потребностями.

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Emp", typeof(int)));
dt.Columns.Add(new DataColumn("Temp", typeof(string)));
dt.Rows.Add(new object[]{100, "S1+S2+S3"});
dt.Rows.Add(new object[]{100, "S1+S2+S3"});
dt.Rows.Add(new object[]{100, "S1+S2+S3"});
dt.Rows.Add(new object[]{100, "S1+S2+S3"});
dt.Rows.Add(new object[]{100, "S1+S2+S3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "Z1+Z2+Z3"});
dt.Rows.Add(new object[]{100, "S1+Z3"});
dt.Rows.Add(new object[]{100, "L1+L2"});
dt.Rows.Add(new object[]{100, "L1+L2"});
dt.Rows.Add(new object[]{100, "A+B"});
dt.Rows.Add(new object[]{100, "C+DD"});
dt.Rows.Add(new object[]{100, "EE+Fin"});
dt.Rows.Add(new object[]{100, "Ke+W"});

string[] values = new string[]{"S1", "S2"};
var qry = dt.AsEnumerable()
	.Where(x=> x.Field<string>("Temp")
			.Split(new string[]{"+"}, StringSplitOptions.RemoveEmptyEntries)
			.Any(y=>values.Contains(y)));


Результат:
Emp Temp
100 S1+S2+S3 
100 S1+S2+S3 
100 S1+S2+S3 
100 S1+S2+S3 
100 S1+S2+S3 
100 S1+Z3 


gani7787

а как насчет того, что не содержит таких значений, как" Fi "и"K"?..
что нам нужно добавить в запрос?..

Рейтинг:
0

Robert Raboud

string[] values = new string[] { "S1", "S2" };
string[] notval = new string[] { "Fi", "K" } ;
var qry = tbl1.AsEnumerable()
                .Where(x => (x.Field<string>("Temp").Contains(values[0]) || 
                            x.Field<string ("Temp").Contains(values[1]) &&
                           (!x.Field<string>("Temp").Contains(notval[0]) || 
                            !x.Field<string ("Temp").Contains(notval[1])));
int count = qry.Count;


gani7787

Спасибо за ваш результат.
Мой запрос, как показано ниже в LINQ без лямбда-выражения.

Tempvalues1 = "S1"," S2"; ==> Для contain value
Tempvalues2 = "Fi", "k"; == & gt; for не содержит значения
qry = (из r в tbl1.Методом asenumerable()
где r.Поле И Л;int> У("EmpNo") == ЭМП &амп;&амп; Р.Поле в<строка> У("темп").Содержит(TempValues1)
&&! (r.Field< string> ("Temp").Содержит ((TempValues2)))
выберите новый
{
}).Рассчитывать();

как получить подсчет повторений фильтра..?

Robert Raboud

добавлен отрицательный поиск решения и переменная для подсчета.

Рейтинг:
0

George Swan

Вы можете использовать Aggregate для удовлетворения multipile целевых значений. Что-то вроде.


var query = dt.AsEnumerable();
           var strs = new[] { "S1", "S2" };
           query = strs.Aggregate(query, (current, s) => current.Where(x => x.Field<string>("Temp").Contains(s)));