Linq to sql 在不使用列名的情况下将LINQ变量添加到字符串列表?

Linq to sql 在不使用列名的情况下将LINQ变量添加到字符串列表?,linq-to-sql,string,stored-procedures,list,Linq To Sql,String,Stored Procedures,List,在ASP.NETMVC项目中,我试图从LINQ变量创建一个列表 这可能是一个非常基本的问题,但如果不使用该变量中数据的实际列名,我就无法实现这一点。问题是,为了使程序尽可能动态,我将把它留给一个存储过程来获取数据。根据从何处获取数据,可以有任意数量的以任何方式命名的列。我所关心的就是把它们的所有值都放到一个列表中,这样我就可以在程序中比较用户输入值和它们 在代码中按列的名称指向这些列意味着我必须创建几十个重载方法,这些方法基本上都做相同的事情。下面是错误的无效代码。但它应该让我明白我的意思 //

在ASP.NETMVC项目中,我试图从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 * */
谢谢你的帮助

我不能100%确定您试图解决的问题是什么,将用户数据与数据库中的特定记录相匹配,但我非常确定您将数据放入列表中的方式有点错误。我

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

然后,当您从SP获取数据时,您可以在DataReader a la中获取数据

DataReader是根据列名编制索引的,因此,如果您运行输入数据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;
      }
   } 
}

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

一点创造性的思考就可以了

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

我试图解决的问题是,项目被创建为尽可能动态,并考虑到未来的更新。当前,存储过程访问一个表。将来,该过程将完全从不同的表中获取数据,具体取决于作为参数传递给它的用户类型。但无论过程中使用哪个表,代码的最终目标都是一样的:查看是否有任何行的值与验证器中的值匹配。