2009-12-03 132 views
1

在C#ASP.Net MVC項目中,我試圖從LINQ變量中創建一個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

我不是100%確定你想要解決什麼問題(將用戶數據與數據庫中的特定記錄進行匹配?),但我確信你正在以一種錯誤的方式去解決這個問題。將數據放入List中。我

噸應該有可能得到您的用戶輸入在一個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; 
     } 
    } 
} 

仍然不確定您正在解決的問題,但是,我希望這有助於您!

+0

我試圖解決的問題是,項目創建時儘可能動態,考慮到未來的更新。目前存儲過程訪問一個表。將來,該過程將根據作爲參數傳入的用戶類型,完全從不同的表中獲取數據。但無論過程中使用哪個表,代碼的最終目標都保持不變:查看是否有任何行的值與驗證程序中的值相匹配。 – Kahn 2009-12-03 12:39:22

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