Переменная LINQ для списка строк без использования имен столбцов? - PullRequest
1 голос
/ 03 декабря 2009

В проекте C # ASP.Net MVC я пытаюсь создать список из переменной LINQ.

Теперь это может быть довольно простой вещью, но я просто не могу заставить это работать без использования фактических имен столбцов для данных в этой переменной. Дело в том, что в стремлении сделать программу как можно более динамичной, я оставляю за собой хранимую процедуру для вывода данных. Может быть любое количество столбцов, в зависимости от того, откуда данные извлекаются. Все, о чем я беспокоюсь, - это перенести все их значения в список , чтобы я мог сравнивать введенные пользователем значения с ними в программе.

Указание на столбцы по их именам в коде означает, что мне придется создавать десятки перегруженных методов, которые в основном делают одно и то же. Ниже ложный неработающий код. Но это должно открыть представление о том, что я имею в виду.

// call for stored procedure
var courses = db.spFetchCourseInformation().ToList();

// if the data fails a check on a single row, it will not pass the check
bool passed = true;

foreach (var i in courses)
{
   // each row should be cast into a list of string, which can then be validated
   // on a row-by-row basis
   List courseRow = new List();
   courseRow = courses[i]; // yes, obviously this is wrong syntax
   int matches = 0;
   foreach (string k in courseRow)
   {
      if (validator.checkMatch(courseRow[k].ToString()))
      {
         matches++;
      }                    
   }
   if (matches == 0)
   {
      passed = false;
      break;
   }
}

Ниже приведен пример того, как я должен это сделать, потому что мне нужно использовать имена для столбцов

for (int i = 0; i < courses.Count; i++)
{
   int matches = 0;

   if (validator.checkMatch(courses[i].Name))
      matches++;

   if (validator.checkMatch(courses[i].RandomOtherColumn))
      matches++;

   if (validator.checkMatch(courses[i].RandomThirdColumn))
      matches++;

   if (validator.checkMatch(courses[i].RandomFourthColumn))
      matches++;

   /* etc...

      * etc...
      * you get the point
      * and one of these for each and every possible variation from the stored procedure, NOT good practice
      * */

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 03 декабря 2009

Небольшое творческое размышление должно сработать.

var courses = db.spFetchCourseInformation()
var values = courses.SelectMany(c => c.GetType().GetProperties()  // gets the properties for your object
                    .Select(property => property.GetValue(c, null))); // gets the value of each property
List<string> stringValues = new List<string>(
                values.Select(v => v == null ? string.Empty : v.ToString()) // some of those values will likely be null
                .Distinct()); // remove duplicates
0 голосов
/ 03 декабря 2009

Я не уверен на 100%, какую проблему вы пытаетесь решить (сопоставление пользовательских данных с конкретной записью в БД?), Но я почти уверен, что вы поступите немного неправильно, поставив данные в списке. I

t должно быть возможным получить пользовательский ввод в IDictionary с ключом, используемым для имени столбца, и объектом в качестве поля входных данных.

Затем, когда вы получаете данные от SP, вы можете получить данные обратно в DataReader (а-ля http://msmvps.com/blogs/deborahk/archive/2009/07/09/dal-access-a-datareader-using-a-stored-procedure.aspx).

DataReaders индексируются по имени столбца, поэтому, если вы запускаете ключи во входных данных IDictionary, вы можете проверить DataReader, чтобы увидеть, есть ли у него совпадающие данные.

using (SqlDataReader reader = Dac.ExecuteDataReader("CustomerRetrieveAll", null))  
{ 
   while (reader.Read()) 
   { 
      foreach(var key in userInputDictionary.AllKeys)
      {
        var data = reader[key];
        if (data != userInputDictionary[key]) continue;
      }
   } 
}

Все еще не уверен насчет проблемы, которую вы решаете, но, надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...