2012-03-21 69 views
0

第一個問題就是 - 我讀了很多很多次,所以有時間投入到我的社區中去!Linq - 從字符串中獲取值

我開始通過LINQ查詢得到一個單行:

var relationshipDetails = (from p in dc.tbl_ClientRelationships 
          where p.ID == relationship_id 
          select p).FirstOrDefault(); 

然後,我期待通過(_cols)字符串列表,這是已知的列名(也形成項目名稱),像這樣:

foreach (string c in _cols) 
    { 
     if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null) 
     { 
      setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c); 
     } 
    } 

setValue()方法基本上返回值分配給夏精(和具有邏輯來確定的類型和應如何分配等。)

我的問題,是否有更好的方法從知道屬性值中獲取Linq對象的值? 它適用於某些形式,但最近剛炸燬了我!

否則,我很想回到舊的方法或從DAL返回DataRow,並且只需簡單引用名稱即可!

由於提前, 馬克

+5

C#不會「爆炸」,它會拋出異常。除其他信息外,異常還包括類型,消息和堆棧跟蹤。 – Jon 2012-03-21 18:15:46

+0

確實需要更好的方法,您在循環中使用了Reflection。這是一個昂貴的操作。生病等待專家回答 – Zenwalker 2012-03-21 18:17:09

+0

你爲什麼要積極試圖拋棄類型安全? – asawyer 2012-03-21 18:17:56

回答

1

第一:

var relationshipDetails = (from p in dc.tbl_ClientRelationships 
          where p.ID == relationship_id 
          select p).FirstOrDefault(); 

LINQ查詢是代表的查詢對象,讓他們分開,並從這些查詢的結果是不同的。在這種情況下,我建議這樣的事情,而不是:

var relationshipDetails = dc.tbl_ClientRelationships 
           .FirstOrDefault(p => p.Id == relationship_id); 

現在,這將是非常緩慢:

foreach (string c in _cols) 
{ 
    if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null) 
    { 
     setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c); 
    } 
} 

您可以方便地到達反射構件基準,並在砍伐開銷,也許是這樣的:(可能不是100%的語法正確)

var properties = relationshipDetails.GetType().GetProperties(); 

foreach (string c in _cols) 
{ 
    var currentProperty = properties.Single(p=> p.Name == c); 

    if (currentProperty.GetValue(relationshipDetails, null) != null) 
    { 
     setValue(currentProperty.GetValue(relationshipDetails, null).ToString(), c); 
    } 
} 

最後 - 爲什麼你這樣做?請詳細說明正是你正在嘗試做的,爲什麼指的列在類型安全的命名方式,即:

relationshipDetails.Id = ... 
relationshipDetails.SomethingElse = ... 
relationshipDetails.AnotherThing = ... 

不會工作你的情況。

+0

謝謝你或詳細的答案,我現在就試試。原因如下:標記包含文本框,複選框,下拉菜單等...控件,所有控件都帶有名稱後綴的數據庫列名稱。當表單加載時,它通過webcontrols循環,並建立列名稱列表。這些可以用來創建SQL更新和插入。加載數據時,我有問題的列名,所以只需要將它們引用到查詢的對象。這聽起來越來越像我應該堅持舊的datarows呢? – RemarkLima 2012-03-21 18:39:45

+0

'所有名稱後綴爲數據庫的列名'您可以向任何加載頁面的人公開有關數據表的私密詳細模式信息嗎?如果這是在代碼審查中出現的,我會強烈建議不要這樣做。 – asawyer 2012-03-21 18:41:26

+0

這一切聽起來像你試圖重新創建'FormView'出於某種原因。 http://msdn.microsoft.com/en-us/library/fyf1dk77(v=vs.85).aspx – asawyer 2012-03-21 18:42:31

2

Linq對(Sql/Entities)最大的優點之一(在我看來)是返回的對象是strongly-typed。您正在使用LinqToX,然後使用反射來分配值,您基本上正在做舊學校DataRow所做的。

我不確定你爲什麼試圖動態分配值。這絕對是一個XY Problem

+0

這一切都開始點擊!我從來沒有完全使用過Linq,所以認爲是時候卡住了!像這樣的信息是非常寶貴的。當「Linq做所有事情!」的炒作時,很容易就會被忽略,當時一些較老的方法也會這樣做。 – RemarkLima 2012-03-21 18:34:59