所以我使用实体框架和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”。
答案 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
的任何的记录