gani7787 Ответов: 1

Как написать запрос LINQ для разделения и поиска столбца min и maximum и возврата на основе строковых значений.


Привет,

Как найти минимальное и максимальное значение и отфильтровать строку за строкой на основе параметра.

1. у меня есть следующие данные:
DataTable dt = new DataTable();
        dt.Columns.AddRange(new[] { new DataColumn("Studentno"),new DataColumn("GRADE"),new DataColumn("SUB B"), new DataColumn("SUB C(MIN)"), new DataColumn("SUB C(MAX)"),
        new DataColumn("SUB D(MIN)") ,new DataColumn("SUB D(MAX)"), new DataColumn("FROM"),new DataColumn("TO"),new DataColumn("SUB E(MIN)"), new DataColumn("SUB E(MAX)") });
        dt.Rows.Add(101, "A", "100", "80", "200", "200", "550", 20, "100", "200", "500");
        dt.Rows.Add(101, "B", "100", "90", "300", "270", "200", 20, "100", null, null);
        dt.Rows.Add(101, "B", "100", "200", "300", "100", "250", 20, "100", "100", "100");
        dt.Rows.Add(101, null, "100", "200", "300", "100", "200", 20, "100", null, null);

2. у меня есть две входные строки, которые я должен "преобразовать" в критерии фильтра:
string string1 = "GRADE#SUB B";
string string2 = "SUB C=100#SUB D=250#SUB E=300";


Сначала я хочу получить строку, которая содержится в пределах 100 ((я.е) подгруппы с (Мин) и Sub c (максимальный)) (взять string2 и разделите веревку и возьмите первый в этом. SUB C=100).

Он должен вернуть две записи:
101,"A", "100", "100", "50", "200", "250", "700", 20, "100"
101, "B", "100", "150", "70", "250", "200", "100", 20, "100"


3. После этого, имея в виду две вышеперечисленные записи, я хочу отфильтровать еще одно условие, которое нужно проверить. Это также необходимо проверить в пределах Min и Max SUB D=300.
Он должен возвращать только одну запись:
101,"A", "100", "100", "50", "200", "250", "700", 20, "100"


4. В конце концов, я хочу получить записи для поля класс и подгруппы Б.

Таким образом, конечным результатом будет
GRADE=A
SUB B=100


Примечание: фильтруйте и проверяйте строку внутри строки с помощью string2 и отобразить результат в виде string1.

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

Вывод я хочу либо простой C#, либо Linq-запрос..???

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

DataTable dt = new DataTable();
        dt.Columns.AddRange(new[] { new DataColumn("Studentno"),new DataColumn("GRADE"),new DataColumn("SUB B"), new DataColumn("SUB C(MIN)"), new DataColumn("SUB C(MAX)"),
        new DataColumn("SUB D(MIN)") ,new DataColumn("SUB D(MAX)"), new DataColumn("FROM"),new DataColumn("TO"),new DataColumn("SUB E(MIN)"), new DataColumn("SUB E(MAX)") });
        dt.Rows.Add(101, "A", "100", "80", "200", "200", "550", 20, "100", "200", "500");
        dt.Rows.Add(101, "B", "100", "90", "300", "270", "200", 20, "100", null, null);
        dt.Rows.Add(101, "B", "100", "200", "300", "100", "250", 20, "100", "100", "100");
        dt.Rows.Add(101, null, "100", "200", "300", "100", "200", 20, "100", null, null);

string string1 = "GRADE#SUB B";
string string2 = "SUB C=100#SUB D=250#SUB E=300";
string[][] subCD = string2.Split('#').Select(s => s.Split('=')).ToArray();

<pre> //Split the conidtion string and format the filter expression
            string[] condition = string2.Split('#');
            string filter = "";
            foreach (string subcondition in condition)
            {
                if (!String.IsNullOrEmpty(filter))
                {
                    filter += " AND ";
                }
                string[] subconditions = subcondition.Split('=');
                filter += "[" + subconditions[0] + "] = '" + subconditions[1] + "'"; 
            }

            //filter the datatable
            var result = dt.Select(filter);

            //split the column names
            string[] fields = string1.Split('#');
            //get the column value from the filter result
            string Grade = result.FirstOrDefault().Field<string>(fields[0]);
            string SUBB = result.FirstOrDefault().Field<string>(fields[1]);

OriginalGriff

И что же?
Сколько из этого вы сделали?
Какая помощь вам нужна?

gani7787

Код не фильтруется должным образом.

я хочу преобразовать его в linq в приведенном выше коде.

потому что у меня есть еще кое-где условие..

вот почему?..?

Maciej Los

Это не сработает, потому что ваши критерии фильтрации не совпадают с именами столбцов. Там нет столбцов: SUB C, SUB D и даже SUB E. Есть столбцы: суб с(Мин), суб c(Макс), размер D(мин.), суб Д(максимум) и т. д. Понял?
Если я вас хорошо понимаю, вы должны определить критерии поиска следующим образом: SUB C(MIN)>=100 AND C(MAX)<=100 и так далее...

Maciej Los

Другая проблема - это тип данных, например: это уравнение невозможно [SUB C(MIN)]>="100" потому что " 100 " - это не число, а строка!

1 Ответов

Рейтинг:
12

Maciej Los

Прежде всего, пожалуйста, прочтите мой комментарий к вашему вопросу... Учитывая, что я был вынужден внести необходимые исправления, проверьте ниже код:

DataTable dt = new DataTable();
        dt.Columns.AddRange(new[]
		{
			new DataColumn("Studentno", typeof(int)), new DataColumn("GRADE", typeof(string)),
			new DataColumn("SUB B", typeof(int)),
			new DataColumn("SUB C(MIN)", typeof(int)),
			new DataColumn("SUB C(MAX)", typeof(int)),
        	new DataColumn("SUB D(MIN)", typeof(int)),
			new DataColumn("SUB D(MAX)", typeof(int)),
			new DataColumn("FROM", typeof(int)),
			new DataColumn("TO", typeof(int)),
			new DataColumn("SUB E(MIN)", typeof(int)),
			new DataColumn("SUB E(MAX)", typeof(int))
		});
        dt.Rows.Add(new object[]{101, "A", 100, 80, 200, 200, 550, 20, 100, 200, 500});
        dt.Rows.Add(new object[]{101, "B", 100, 90, 300, 270, 200, 20, 100, null, null});
        dt.Rows.Add(new object[]{101, "B", 100, 200, 300, 100, 250, 20, 100, 100, 100});
        dt.Rows.Add(new object[]{101, null, 100, 200, 300, 100, 200, 20, 100, null, null});
 

string iniCriteria1 = "SUB C=100#SUB D=250#SUB E=300";
string iniCriteria2 = "GRADE#SUB B";

var sCriteria1 = String.Join(" AND ", iniCriteria1.Split(new string[] {"#"}, StringSplitOptions.RemoveEmptyEntries)
	.Select(x=> "([" + x.Split('=')[0] + "(MIN)]<=" + x.Split('=')[1] + " AND [" +
					x.Split('=')[0] + "(MAX)]>=" + x.Split('=')[1] + ")").ToList());
//sCriteria1.Dump();

var rows = dt.Select(sCriteria1);
//rows.Dump();

foreach(DataRow r in rows)
{
	var cols = iniCriteria2.Split(new string[]{"#"}, StringSplitOptions.RemoveEmptyEntries);
	foreach(string c in cols)
	{
		Console.WriteLine("{0}={1}", c, r[c]);
	}
}


Результат:
GRADE=A
SUB B=100


Примечание: я протестировал приведенный выше код с помощью Помощью linqpad[^]


gani7787

Спасибо за ваш отличный код..

можно ли добавить условие where в это для каждого цикла.

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

где

пусть FrS = Convert.ToDouble(row. Field< double> ("FROM"))
пусть ГС = конвертировать.ToDouble(row. Field & lt;double> ("TO"))
ряд.Поле в<строка> У("сорт") == ГРД и усилитель; &
вал &ГТ;= ФРС и усилитель; & Вэл &ЛТ;= ТОС

Примечание: что произойдет, если значение столбца равно null. как справиться с нулевым условием..??

Я попробовал следующий код. я получаю ошибку. не удается найти столбец A1.

// Для сравнения от и до
строка FrS = " From";
строки ТОС = "чтобы";
двойной размер msize = 20;
программа sqlcmd += " и ( [" + ФРС + "] &ЛТ; "+ msize + "и" + ГС + "] &ГТ; " + msize + " ) ";

// Для отдела
строки strdeptvalue = "А1";
строки strdept = "отдел";
sqlcmd + = " и ([" + strdept +"] = " + strdeptvalue + ") ";

Как изменить свой код, как выше условия...?????

ниже приведен мой обновленный datatable..

DataTable dt = новый DataTable();
ДТ.Столбцы.AddRange(новый[] { новый объект datacolumn("Studentno",вызова typeof(инт)),новый datacolumn("класс"),новый объект datacolumn("суб Б",вызова typeof(инт)),
новый datacolumn("суб с(Мин)",вызова typeof(инт)), новый datacolumn("суб c(Макс)",вызова typeof(инт)),новый datacolumn("суб Д(мин)",вызова typeof(инт)) ,
новый datacolumn("суб" Д " (Макс)",вызова typeof(инт)), новый datacolumn("от"),Новый объект datacolumn("в"),новый объект datacolumn("суб е(мин)",вызова typeof(инт)),
новый datacolumn("суб е(Макс)",вызова typeof(инт)),новый datacolumn("отдел",вызова typeof(строка)) });
dt. Rows. Add(101, "A", 100, 80, 200, 200, 550, 20, 100, 200, 500,"А1");
dt. Rows. Add(101, "B", 100, 90, 300, 270, 200, 20, 100, null, null, " B1");
dt. Rows. Add(101, "B", 100, 200, 300, 100, 250, 20, 100, 100, 100,"С1");
dt. Rows. Add(101, null, 100, 200, 300, 100, 200, 20, 100, нуль, нуль, " D1");

gani7787

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

DataTable dt = новый DataTable();
ДТ.Столбцы.AddRange(новый[] { новый объект datacolumn("Studentno",вызова typeof(инт)),новый datacolumn("класс"),новый объект datacolumn("суб Б",вызова typeof(инт)),
новый datacolumn("суб с(Мин)",вызова typeof(инт)), новый datacolumn("суб c(Макс)",вызова typeof(инт)),новый datacolumn("суб Д(мин)",вызова typeof(инт)) ,
новый datacolumn("суб" Д " (Макс)",вызова typeof(инт)), новый datacolumn("от"),Новый объект datacolumn("в"),новый объект datacolumn("суб е(мин)",вызова typeof(инт)),
новый datacolumn("суб е(Макс)",вызова typeof(инт)),новый datacolumn("отдел",вызова typeof(строка)) });
dt. Rows. Add(101, "A", 100, 80, 200, 200, 550, 20, 100, 200, 500,"А1");
dt. Rows. Add(101, "B", 100, 90, 300, 270, 200, 20, 100, null, null, " B1");
dt. Rows. Add(101, "B", 100, 200, 300, 100, 250, 20, 100, 100, 100,"С1");
dt. Rows. Add(101, null, 100, 200, 300, 100, 200, 20, 100, нуль, нуль, " D1");


Список<строка> У AllColumns1 = новый список<строка> и GT;() { "класс", "суб Б" };

string[] AllColumns = AllColumns1.Метод toArray();
строка string2 = " SUB C=100#SUB D=250#SUB E=300";

string[] paras = string2. Split('#');
Список<строкаданных> Список = новый список<строкаданных&ГТ;();
строка sqlcmd = "";

для (int i = 0; i & lt; paras.Длина; i++)
{
string[] par = paras[i]. Split('=');
строка mixpar = par[0] + "(MIN)";
строка maxpar = par[0] + "(MAX)";
int mvalue = преобразовать.ToInt32(par[1]);
программа sqlcmd += " ( [" + mixpar + "] &ЛТ; "+ mvalue + "и" + maxpar + "] &ГТ; " + mvalue + " ) ";
if ((i + 1)! = paras.Длина)
{
sqlcmd + = " и ";
}


}

// Для сравнения от и до
строка FrS = " From";
строки ТОС = "чтобы";
двойной размер msize = 20;
программа sqlcmd += " и ( [" + ФРС + "] &ЛТ; "+ msize + "и" + ГС + "] &ГТ; " + msize + " ) ";

// Для отдела
строки strdeptvalue = "А1";
строки strdept = "отдел";
sqlcmd + = " и ([" + strdept +"] = " + strdeptvalue + ") ";

DataRow[] result = dt. Select(sqlcmd);
List & lt;string & gt; result1 = новый список & lt;string>();

for (int i = 0; i < AllColumns.Длина; i++)
{

foreach (строка DataRow в результате)
{
результат1.Добавить(коллекция схем allcolumns[я] + "=" + строка[коллекция схем allcolumns[я]]);
}


}

Maciej Los

Извините, но эти вопросы изначально не были опубликованы.
Но:
1) "Что произойдет, если значение столбца равно null? как справиться с нулевым условием..??".
Что ж, это твоя работа. Вы должны это проверить.

2) "Как изменить свой код, как указано выше.?".
Думаю, я уже ответил на этот вопрос. Я показал тебе, как этого достичь. Теперь вы должны изучить мой код.

Совет: это очень хорошая практика, чтобы принимать полезные ответы (используйте зеленую кнопку).

Овации,
Мацей

gani7787

Да. он попробовал другую логику и код.

Спасибо..это тоже будет полезно определенно..

но в чем же заключается ошибка?

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

На самом деле [A1] - это не столбец. это ценность...???

Maciej Los

Используйте отладчик. "A1" - это не столбец (я не видел его в определении datatable), это значение столбца" Dept"!

gani7787

Да, я отладил работу и нашел решение.

нам нужно заключить '(одинарные кавычки) до и после A1.

Спасибо, приятель...

Maciej Los

Всегда пожалуйста. :)

Овации,
Мацей