在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 * */
感谢您的帮助!
答案 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