2011-12-07 77 views
0

給定一個包含多行的DataView,我想根據以下標準提取一行;if..if else..else..in linq to objects

  • 如果某行具有一定的字符串開始,並具有一定的字符串結尾,然後選擇其他所有
  • 如果沒有一行滿足所述第一標準,那麼就找一排,與某些啓動上面一行字符串
  • 如果我們無法匹配上述任何內容,則默認爲null。

我的快速嘗試只是返回滿足任何條件的第一行(如果VB語法不正確,我不太熟悉它);

Dim result = (From row In dv.Table.Rows() _ 
       Where (GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) AndAlso _ 
       GetString(row, "id").EndsWith(Me.ID.Substring(Me.RegisteredID.Length - 2, 2), StringComparison.OrdinalIgnoreCase)) OrElse _ 
       GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) _ 
       Select row).FirstOrDefault() 

編輯:我的意思補充說,像https://stackoverflow.com/a/443055/685760看起來很有希望,但我不認爲它會在我的情況下工作。如果我錯了,隨時糾正我。

回答

1

即使不是不可能,在查詢中表達這種算法也很困難。查詢只會獨立地判斷每一行。 你需要有第一個標準的結果集,然後才能檢查第二個...

在我看來,你需要做三個單獨的查詢(這可能只是結束了執行只有第一個,如果它返回任何結果,因爲那時你已經達到了你的第一個標準,並且不需要檢查其他結果)。 另一種方式是,我想通過對數據進行某種排序,但最終可能會出現不太清晰且性能較差的情況。

在任何情況下,即使有一種方法可以在查詢中表達您的需求,您的代碼對於常見的凡人來說可讀性要高出一百倍。有這樣的東西,過度使用Linq;)

+0

我懷疑同樣多。我只是希望得到證實。我只是不確定是否有一些擴展方法或linq魔術可以應用,但仍然可以像我希望的那樣進行一個看起來很複雜的查詢工作,並且它可以用於常見的凡人:) –

+0

將它拆分爲兩個查詢(帶有註釋)使它可讀並且不笨重。我沒有試圖用linq作爲我的錘子,但我認爲最好是在dataview和multiple for循環上過濾。這兩個查詢似乎運作良好。 –