2013-07-22 47 views
0

我有一個SQL表,它有一個簡單的字符串字段,可能包含單個值(例如'ABC'),或者它可能包含由管道定界的列表('|')字符(例如'ABC | EDF | GHI')。使用LINQ來確定數據庫表中是否存在值

如果我有一個SharePoint列表,並希望交叉檢查,以確保所有在我的SP名單中值的SQL表存在,我可以很容易地做到這一點假設SQL場只有一個值:

var listitems = from SPListItem item in spList.Items 
       where item[myfieldname].Equals(valueImChecking) 
       select item; 

如何使用類似的方法檢查相同的SQL字段,假定它包含由'|'分隔的值列表?如果這個字段的值是'ABC | EDF | GHI',並且我正在檢查它是否包含'GHI',那麼我如何在LINQ中構建查詢?

TIA, -Tony。

+0

我想你需要String.Split方法。不幸的是,它不存在於Linq-to-SQL(請參閱[分割字段在linq中的字符串](http://stackoverflow.com/questions/9283752/split-field-a-string-in-a-linq) )。因此,您可能需要將數據檢索到本地計算機內存(通過將'IQueryable'轉換爲'IEnumerable')來處理該字段。 –

+0

@Tony:請在我的回答下看看CédricBignon的評論。這是你想要的? – shahkalpesh

+0

@shahkalpesh:是的,我相信。謝謝。 – Tony

回答

0
var listitems = from SPListItem item in spList.Items 
       where item[myfieldname].ToString().Contains(valueImChecking) 
       select item; 

Contains字符串上的方法應該有所幫助。

+0

我試過'Contains'但它不起作用。我在[myfieldname]後獲得的唯一4個智能感知選項是:
等於
GetHashCode
GetType
ToString – Tony

+0

代碼是否編譯,撇開智能感知不工作?修改了答案,在字段值上調用'ToString',以便可以執行'Contains'。 – shahkalpesh

+0

如果'item [myfieldname]'中的所有項目具有相同的大小,則只包含工作。否則它可能會給出錯誤的結果。 –

0

我會建議分割值並將它們寫入一個單獨的表。如果您想稍後查找它們,我不認爲在同一個字段中存儲多個值是一個好設計。

如果你不想改變你的數據庫,你可以使用shahkalpesh的答案。但是,如果某些值可能包含其他值(如WXYZ包含XYZ),則只會給出可能的候選人列表。你需要檢查的結果在內存:

// this filters for possible candidates 
var candidates = from item in spList.Items 
       where item[myfieldname].ToString().Contains(valueImChecking) 
       select item; 

// this filters the result using ling-to-objects 
var listItems = from candidate in candidates.AsEnumerable() 
       where candidate[myfieldname].ToString().Split('|').Contains(valueImChecking) 
       select candidate; 

使用AsEnumerable切換到LINQ到對象。這是必需的,因爲LINQ to SQL不支持Split。

您可以使用第一個查詢(它來自shahkalpesh的回答)進行一些預過濾。
如果您的Items表很小,將所有內容加載到內存中並使用ling-to-objects(僅使用第二個查詢)進行檢查可能也是一個好主意。

相關問題