使用LINQ确定DB表中是否存在值

时间:2013-07-22 14:39:48

标签: sql linq

我有一个SQL表,它有一个简单的字符串字段,可能包含一个值(例如'ABC'),或者它可能包含一个由管道('|')字符分隔的列表(如'ABC | EDF' | GHI'例如)。

如果我有一个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, 托尼。

2 个答案:

答案 0 :(得分:0)

var listitems = from SPListItem item in spList.Items 
                where item[myfieldname].ToString().Contains(valueImChecking) 
                select item;
字符串上的

Contains方法应该有帮助。

答案 1 :(得分: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-To-Objects。这是必需的,因为LINQ to SQL不支持Split。

您可以使用第一个查询(取自shahkalpesh的答案)进行一些预过滤。
如果您的Items表很小,那么将所有内容加载到内存中并使用ling-to-objects(仅使用第二个查询)进行检查也是一个好主意。