Linq to entities – 2个键之间的第一个字符串
我正在使用entity framework,并且遇到了缺乏对某些扩展的支持的问题。
我有2个键(都是char) fromKey
和toKey
,我正在构建一个Where
语句,它将搜索Stores
列表,并选择Store.Name
的第一个字母在fromKey
和toKey
之间的位置。
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__0
和p__linq__1
将被设置为传入的值"0"
和"9"
。
- 在ASP.NET Web Api中使用“ExceptionHandler”需要一个完整的示例来处理未处理的exception?
- 启动进程时System.ComponentModel.Win32Exception – 找不到文件,但文件存在
- 使用C#中字符串数组中的项创建变量名称
- C#,在Windows上检测选定的文本?
- 示例:使用.NET / C中的委托加速Reflection API#
- Linq插入具有对现有记录的引用的新行的问题
- Thread.Sleep(timeout)和ManualResetEvent.Wait(timeout)有什么区别?
- 符号在MSIL中的含义是什么?
- PrincipalSearcher和DirectorySearcher之间的区别