LINQ变量到不使用列名的字符串列表?

时间:2009-12-03 09:51:10

标签: linq-to-sql string stored-procedures list

在C#ASP.Net MVC项目中,我正在尝试创建一个List< string>来自LINQ变量。

现在这可能是一个非常基本的东西,但是如果不使用该变量中数据的实际列名,我就无法工作。问题在于,为了尽可能使程序尽可能动态,我将其留给存储过程来获取数据。根据获取数据的位置,可以有任何数量的任何方式命名列。我所关心的只是将它们的所有值都放入List< string>中,以便我可以在程序中将用户输入值与它们进行比较。

在代码中按照名称指向列意味着我必须制作几十个重载方法,这些方法基本上只做同样的事情。以下是错误的无效代码。但它应该打开我的意思。

// 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 :(得分:0)

我不是100%确定你要解决的问题是什么(将用户数据与数据库中的特定记录相匹配?),但我很确定你会以一种错误的方式来解决这个问题列表中的数据。我

t应该可以在IDictionary中输入用户输入,其中键用作列名,对象作为输入数据字段。

然后,当您从SP获取数据时,您可以在DataReader(la 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;
      }
   } 
}

仍然不确定你正在解决的问题,但我希望这有帮助!

答案 1 :(得分:0)

一点创意反思应该可以解决问题。

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