使用子字符串执行linq搜索 - 有更好的方法吗?

时间:2012-09-06 14:35:10

标签: linq entity-framework

我正在使用Entity Framework并已开始使用linq编写查询。

我有一个Store表,其中每个商店都有一个名称字段。我想要做的其中一个搜索是首字母,我正试图找到实现它的最佳方法。我认为最有效率。

大多数搜索只查找一个键,'A','B','C'等,但其中一个搜索的不同之处在于组'0-9'将包含一个键列表,一个用于0,一对一等等所以我的出发点是某种列表。

然后我需要说明商店名称是否以列表中的任何键开头,因为商店不会在表格中存储首字母。

有两件事我正在寻求帮助。首先,如我所概述的那样如何让linq正常工作。其次,有关这是否是回收数据的最佳/唯一方法或是否有更好的方法的任何建议。

3 个答案:

答案 0 :(得分:6)

您的问题不是很清楚,但据我所知,您希望搜索以密钥列表中的密钥开头的商店。你可以这样做:

List<string> keys = new List<string>() { "A", "B", "M" };
var result = stores.Where(store => keys.Any(key => store.Name.StartsWith(key));

答案 1 :(得分:1)

如果查询可能不同,那么对于字母:

stores.Where(s=>s.Name.First == c);

对于数字:

stores.Where(char.IsDigit);

如果它们必须相同,那么我建议使用一个字符范围:

stores.Where(s=> c1 <= s.Name.First && s.Name.First <= c2)

如果需要,您可以按元组表示范围:

Tuple<char, char> range = Tuple.Create('A', 'A');
//Tuple<char, char> range = Tuple.Create('0', '9');
stores.Where(s=> range.Item1 <= s.Name.First && s.Name.First <= range.Item2)

编辑:使用实体框架中的功能

Tuple<char, char> range = Tuple.Create('A', 'A');
//Tuple<char, char> range = Tuple.Create('0', '9');
stores.Where(s=> range.Item1 <= s.Name.Substring(0, 1) && s.Name.Substring(0, 1) <= range.Item2)

答案 2 :(得分:0)

我在另一个帖子上问了一个更具体的问题。

以下是答案:

Linq to entities - first letter of string between 2 keys