Linq to entities – 2个键之间的第一个字符串

我正在使用entity framework,并且遇到了缺乏对某些扩展的支持的问题。

我有2个键(都是char) fromKeytoKey ,我正在构建一个Where语句,它将搜索Stores列表,并选择Store.Name的第一个字母在fromKeytoKey之间的位置。

string[0]不起作用, Substring不起作用 – 任何人都有任何想法如何绕过这个?

子串方法的代码:

 public static IQueryable FindActiveByName() { var r = new ReadRepo(Local.Items.Uow.Context); Tuple range = Tuple.Create("0", "9"); return r.Find().Where(s => range.Item1 <= s.Name.Substring(0, 1) && s.Name.Substring(0, 1) <= range.Item2); } 

给我一个错误:

运算符<=无法应用于字符串

UPDATE

Anwser由nemesV提供

  public static IQueryable FindActiveByName() { Tuple range = Tuple.Create('R', 'S'); var r = new ReadRepo(Local.Items.Uow.Context); var keys = Enumerable .Range(range.Item1, (int)range.Item2 - (int)range.Item1 + 1) .Select(k => ((char)k).ToString()); return r.Find(s => keys.Contains(s.Name.Substring(0, 1))); } 

我手边没有EF所以也许这也行不通,但您可以尝试以下解决方法:

首先使用from to字母生成一个字符串。 然后你可以使用Contains来检查Name的第一个字符是否在生成的字母中:

 public static IQueryable FindActiveByName() { var r = new ReadRepo(Local.Items.Uow.Context); Tuple range = Tuple.Create('0', '9'); var letters = Enumerable .Range(range.Item1, (int)range.Item2 - (int)range.Item1 + 1) .Select(x => ((char)x).ToString() return r.Find().Where(s => letters.Contains(s.Name.Substring(0, 1))); } 

或者你有明显的工作解决方法:

  • 在SQL中编写查询(EF具有API来执行任意查询并构建实体)
  • Where将强制进行查询评估的Where之前插入.ToArray() ,并在客户端进行Name.Substring比较。

你可以尝试这样的事情:

 string[] data = { "Alex", "Bob", "John", "Danny", "Roy" }; char fromKey = 'A', toKey = 'D'; var query = data.Where(d => (int)d.First() >= (int)fromKey && (int)d.First() <= (int)toKey); 

该查询包含Alex, Bob and Danny

这只是一个例子。 您可以根据需要进行更改。 希望这会有所帮助。

您的代码实际存在的唯一问题是.NET string类没有重载的<=>=运算符。 因此,代码无法编译(它与Entity Framework无关)。 您可以使用string.CompareTo方法代替运算符:

 public static IQueryable FindActiveByName() { var r = new ReadRepo(Local.Items.Uow.Context); Tuple range = Tuple.Create("0", "9"); return r.Find().Where(s => range.Item1.CompareTo(s.Name.Substring(0, 1)) <= 0 && s.Name.Substring(0, 1).CompareTo(range.Item2) <= 0); } 

这将编译并与Entity Framework一起使用并创建此SQL:

 SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], FROM [dbo].[Stores] AS [Extent1] WHERE (@p__linq__0 <= (SUBSTRING([Extent1].[Name], 0 + 1, 1))) AND ((SUBSTRING([Extent1].[Name], 0 + 1, 1)) <= @p__linq__1) 

执行查询时,两个SQL参数p__linq__0p__linq__1将被设置为传入的值"0""9"