搜索在字符串列中包含使用LINQ的字符串列表

时间:2014-03-21 20:28:53

标签: c# sql linq entity-framework

所以我使用实体框架和linq,但我使用的是函数方法。

说我有这样的ID列表:

List<string> bids = { "33", "44", "55", "66" }; // this is what the split ends up

但是在数据库中,我有一个名为“BuildingIDs”的字符串列存储为逗号分隔值。 “query”是IQueryable&lt; BuildingTable&gt;。

        List<string> bids = search_string_full_of_comma_bids.Split(';').ToList();
        query = query.Where(t => bids.Contains(t.BuildingIDs));
        //query = query.Any(t => t.BuildingIDs.Contains(bids); // Loop needed.
        return query;

所以我想搜索“BuildingIDs”数据库字符串,看它是否有任何“search_string_full_of_comma_bids”

数据库中的BuildingTable:

project 1 | pname = 'building complex #1' | BuildingIDs = '33;54;42;56;21;56;32;'
project 2 | pname = 'building complex #2' | BuildingIDs = '77;42;31;12;33;'

但我的搜索查询可能是“33”或“77”...搜索“33”将同时提供。搜索“54; 31”也将同时提供。

所以标准的SQL查询就像:

SELECT * FROM BuildingTable WHERE BuildingIDs LIKE '%54%' OR BuildingIDs LIKE '%31%'.

不幸的是,我不能在Linq中添加一堆“OR”。

2 个答案:

答案 0 :(得分:4)

List<string> bids = search_string_full_of_comma_bids.Split(';').ToList();
        query = query.Where(t => bids.Any(b=> 
                               t.BuildingIDs.StartsWith (b+";") //if it's in the start
                              || t.BuildingIds.EndsWith (";" + b) //end 
                              || t.BuildngIds.Contains(";" + b + ";") //;id;
                              ));

你可以试试这样的东西,但这很难看。你应该有表而不是在字符串中保存ID。

鉴于您的数据,您可能根本不需要.EndsWith,通常您会在最后一个没有“;”时使用它。在末尾。

答案 1 :(得分:0)

我同意@ tim-s,因为数据结构是这里问题的原因,但是,我创建了一个可以帮助解决这个问题的search extensions nuget package。 NinjaNye.SearchExtensions将使您能够执行以下操作:

using NinjaNye.SearchExtensions;
...
List<string> bids = search_string.Split(';').Select(b => ";" + b + ";");
query = query.Search(t => ";" + t.BuildingIDs + ";").Containing(bids)

这将只返回包含所提供的BuildingID

任何的记录