Выбор данных с несколькими условиями

У меня есть datatable с 4 столбцами A, B, C и D, так что конкретная комбинация значений для столбцов A, B и C уникальна в datatable.

objective: найти значение столбца D для данной комбинации значений для столбцов A, B и C.

Я думаю, что цикл по набору строк данных должен сделать это. Есть ли способ использовать Datatable.Select () для этого? Чтобы быть более конкретным – могу ли я иметь несколько условий в фильтре выбора, то есть логическое условие оператора И для каждого из столбцов A, B и C.

Да, метод DataTable.Select поддерживает логические операторы так же, как вы бы использовали их в «реальном» выражении SQL:

 DataRow[] results = table.Select("A = 'foo' AND B = 'bar' AND C = 'baz'"); 

См. DataColumn.Expression в MSDN для синтаксиса, поддерживаемого методом Select DataTable.

Вам нужно использовать DataTable.Select() ? Я предпочитаю писать запрос linq для такого рода вещей.

 var dValue= from row in myDataTable.AsEnumerable() where row.Field("A") == 1 && row.Field("B") == 2 && row.Field("C") == 3 select row.Field("D"); 

Я обнаружил, что слишком много и будет возвращать неверные результаты (для .NET 1.1 в любом случае)

 DataRow[] results = table.Select("A = 'foo' AND B = 'bar' AND C = 'baz' and D ='fred' and E = 'marg'"); 

В моем случае A было 12-м полем в таблице, и выбор фактически игнорировал его.

Однако, если бы я сделал

 DataRow[] results = table.Select("A = 'foo' AND (B = 'bar' AND C = 'baz' and D ='fred' and E = 'marg')"); 

Фильтр работал правильно!

Попробуй это,
Я думаю, это одно из простых решений.

 int rowIndex = table.Rows.IndexOf(table.Select("A = 'foo' AND B = 'bar' AND C = 'baz'")[0]); string strD= Convert.ToString(table.Rows[rowIndex]["D"]); 

Удостоверьтесь, что сочетание значений для столбцов A, B и C уникально в datatable.

  protected void FindCsv() { string strToFind = "2"; importFolder = @"C:\Documents and Settings\gmendez\Desktop\"; fileName = "CSVFile.csv"; connectionString= @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+importFolder+";Extended Properties=Text;HDR=No;FMT=Delimited"; conn = new OdbcConnection(connectionString); System.Data.Odbc.OdbcDataAdapter da = new OdbcDataAdapter("select * from [" + fileName + "]", conn); DataTable dt = new DataTable(); da.Fill(dt); dt.Columns[0].ColumnName = "id"; DataRow[] dr = dt.Select("id=" + strToFind); Response.Write(dr[0][0].ToString() + dr[0][1].ToString() + dr[0][2].ToString() + dr[0][3].ToString() + dr[0][4].ToString() + dr[0][5].ToString()); } 
 Dim dr As DataRow() dr = dt.Select("A="& a & "and B="& b & "and C=" & c,"A",DataViewRowState.CurrentRows) 

Где A, B, C – имена столбцов, где второй параметр для выражения сортировки

Если вы действительно не хотите сталкиваться с множеством раздражающих ошибок (датифф и такие не могут быть оценены в DataTable.Select между прочим, и даже если вы сделаете так, как предлагалось использовать DataTable.AsEnumerable вам будет сложно оценить поля DateTime) do следующие:

1) Модель ваших данных (создайте class с столбцами DataTable)

пример

 public class Person { public string PersonId { get; set; } public DateTime DateBorn { get; set; } } 

2) Добавьте этот вспомогательный class в свой код.

 public static class Extensions { ///  /// Converts datatable to list dynamically ///  /// Class name /// data table to convert /// List public static List ToList(this DataTable dataTable) where T : new() { var dataList = new List(); //Define what attributes to be read from the class const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; //Read Attribute Names and Types var objFieldNames = typeof(T).GetProperties(flags).Cast(). Select(item => new { Name = item.Name, Type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType }).ToList(); //Read Datatable column names and types var dtlFieldNames = dataTable.Columns.Cast(). Select(item => new { Name = item.ColumnName, Type = item.DataType }).ToList(); foreach (DataRow dataRow in dataTable.AsEnumerable().ToList()) { var classObj = new T(); foreach (var dtField in dtlFieldNames) { PropertyInfo propertyInfos = classObj.GetType().GetProperty(dtField.Name); var field = objFieldNames.Find(x => x.Name == dtField.Name); if (field != null) { if (propertyInfos.PropertyType == typeof(DateTime)) { propertyInfos.SetValue (classObj, ConvertToDateTime(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(int)) { propertyInfos.SetValue (classObj, ConvertToInt(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(long)) { propertyInfos.SetValue (classObj, ConvertToLong(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(decimal)) { propertyInfos.SetValue (classObj, ConvertToDecimal(dataRow[dtField.Name]), null); } else if (propertyInfos.PropertyType == typeof(String)) { if (dataRow[dtField.Name].GetType() == typeof(DateTime)) { propertyInfos.SetValue (classObj, ConvertToDateString(dataRow[dtField.Name]), null); } else { propertyInfos.SetValue (classObj, ConvertToString(dataRow[dtField.Name]), null); } } } } dataList.Add(classObj); } return dataList; } private static string ConvertToDateString(object date) { if (date == null) return string.Empty; return HelperFunctions.ConvertDate(Convert.ToDateTime(date)); } private static string ConvertToString(object value) { return Convert.ToString(HelperFunctions.ReturnEmptyIfNull(value)); } private static int ConvertToInt(object value) { return Convert.ToInt32(HelperFunctions.ReturnZeroIfNull(value)); } private static long ConvertToLong(object value) { return Convert.ToInt64(HelperFunctions.ReturnZeroIfNull(value)); } private static decimal ConvertToDecimal(object value) { return Convert.ToDecimal(HelperFunctions.ReturnZeroIfNull(value)); } private static DateTime ConvertToDateTime(object date) { return Convert.ToDateTime(HelperFunctions.ReturnDateTimeMinIfNull(date)); } } public static class HelperFunctions { public static object ReturnEmptyIfNull(this object value) { if (value == DBNull.Value) return string.Empty; if (value == null) return string.Empty; return value; } public static object ReturnZeroIfNull(this object value) { if (value == DBNull.Value) return 0; if (value == null) return 0; return value; } public static object ReturnDateTimeMinIfNull(this object value) { if (value == DBNull.Value) return DateTime.MinValue; if (value == null) return DateTime.MinValue; return value; } ///  /// Convert DateTime to string ///  ///  /// if true it will execlude time from datetime string. Default is false ///  public static string ConvertDate(this DateTime datetTime, bool excludeHoursAndMinutes = false) { if (datetTime != DateTime.MinValue) { if (excludeHoursAndMinutes) return datetTime.ToString("yyyy-MM-dd"); return datetTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); } return null; } } 

3) Легко конвертируйте свой DataTable (dt) в список объектов со следующим кодом:

 List persons = Extensions.ToList(dt); 

4) получайте удовольствие, используя Linq без раздражающей row.Field вы должны использовать при использовании AsEnumerable

пример

 var personsBornOn1980 = persons.Where(x=>x.DateBorn.Year == 1980); 
  • Выберите все столбцы после JOIN в LINQ
  • jQuery: Лучшая практика для заполнения выпадающего списка?
  • Автоматическое изменение размера элемента SELECT в соответствии с выбранной шириной OPTION
  • Вставка данных в таблицу с результатом другого запроса выбора
  • INSERT INTO ... SELECT для всех столбцов MySQL
  • MySQL SELECT LIKE или REGEXP для сопоставления нескольких слов в одной записи
  • Как фильтровать массив объектов на основе значений во внутреннем массиве с jq?
  • mySQL возвращает все строки, когда поле = 0
  • Как работает ORDER BY RAND () MySQL?
  • Лучший способ отменить выбор в jQuery?
  • Можно ли настроить UITableView для разрешения множественного выбора?
  • Давайте будем гением компьютера.