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

使用子字符串执行linq搜索-有更好的方法吗?,linq,entity-framework,Linq,Entity Framework,我正在使用实体框架,并已开始使用linq编写查询 我有一个Store表,其中每个Store都有一个name字段。我想做的搜索之一是通过首字母,我正试图找到实现它的最佳方式。我说的最好是指最有效率 大多数搜索只查找一个键“A”、“B”、“C”等,但其中一个搜索不同,组“0-9”将包含一个键列表,一个用于0,一个用于1等。因此,我的起点是某种类型的列表 然后我需要说明商店名称是否以列表中的任何键开头,因为商店不在表中存储首字母 有两件事我需要帮助。首先,如何让linq按照我概述的那样工作。第二,关于

我正在使用实体框架,并已开始使用linq编写查询

我有一个Store表,其中每个Store都有一个name字段。我想做的搜索之一是通过首字母,我正试图找到实现它的最佳方式。我说的最好是指最有效率

大多数搜索只查找一个键“A”、“B”、“C”等,但其中一个搜索不同,组“0-9”将包含一个键列表,一个用于0,一个用于1等。因此,我的起点是某种类型的列表

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


有两件事我需要帮助。首先,如何让linq按照我概述的那样工作。第二,关于是否有最好的/唯一的方法带回数据,或者是否有更好的方法,是否有任何建议。

您的问题不是很清楚,但据我所知,您希望搜索以在密钥列表中找到的密钥开始的存储。你可以这样做:

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

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

stores.Where(s=>s.Name.First == c);
至于数字:

stores.Where(char.IsDigit);
如果它们必须相同,那么我建议使用字符范围:

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

stores.Where(s=>c1我在另一个线程上问了一个更具体的问题

答案如下:


实体框架不支持在表达式中使用
First()
这种方式。它将引发运行时异常(在您使代码完全可编译之后)。有趣。相反,请使用索引或EF扩展。解决方案的基本形式应该可以使用。@Slauma-是的,你是对的,我正在努力找到一种提供“between”函数的语法-字符串[0]不起作用,如果转换为字符串,我可以使用元组方法(似乎错误)上面的列表方法会起作用,但它意味着对表进行更改,所以除非必要,否则我将避免这种情况。有什么想法吗?在这里找到答案:。更新答案。
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)