【问题标题】:LINQ variable to list of string without using column names?LINQ变量到字符串列表而不使用列名?
【发布时间】:2009-12-03 09:51:09
【问题描述】:

在 C# ASP.Net MVC 项目中,我试图从 LINQ 变量中创建一个 List

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

在代码中通过名称指向列意味着我必须创建几十个重载方法,它们基本上都在做同样的事情。下面是错误的非功能代码。但它应该会打开我的意思的想法。

//调用存储过程 var 课程 = db.spFetchCourseInformation().ToList(); // 如果数据单行校验失败,则不通过校验 布尔通过=真; foreach(课程中的 var i) { // 每一行都应该被转换成一个字符串列表,然后可以对其进行验证 // 逐行计算 列出 courseRow = new List(); courseRow = 课程[i]; // 是的,显然这是错误的语法 整数匹配 = 0; foreach(courseRow 中的字符串 k) { if (validator.checkMatch(courseRow[k].ToString())) { 匹配++; } } 如果(匹配 == 0) { 通过=假; 休息; } }

下面是我目前必须如何做的一个例子,因为我需要使用列的名称

for (int i = 0; i

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

    然后,当您从 SP 获取数据时,您可以在 DataReader 中取回数据(例如 http://msmvps.com/blogs/deborahk/archive/2009/07/09/dal-access-a-datareader-using-a-stored-procedure.aspx)。

    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;
          }
       } 
    }
    

    仍然不确定您要解决的问题,但希望对您有所帮助!

    【讨论】:

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

    一点创意思考就可以解决问题。

    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
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多