C# LINQ to SQL查找语句中单词以特定字符开头的记录
我有一个SQL Server表:C# LINQ to SQL查找语句中单词以特定字符开头的记录,c#,entity-framework-core,ef-core-3.1,C#,Entity Framework Core,Ef Core 3.1,我有一个SQL Server表: ID | Code | Name 1 | AS | Andrew Smith 2 | RA | Ryan Andrews 3 | ZS | Zach Simmons 我想查找名称列中代码的开头或姓氏的开头与关键字短语匹配的记录。例如,如果关键字短语为“A”,则应返回: 1 | AS | Andrew Smith 2 | RA | Ryan Andrews 因为Andrew Smith的代码和名字与“A”匹配,Andre Ryan
ID | Code | Name
1 | AS | Andrew Smith
2 | RA | Ryan Andrews
3 | ZS | Zach Simmons
我想查找名称列中代码的开头或姓氏的开头与关键字短语匹配的记录。例如,如果关键字短语为“A”,则应返回:
1 | AS | Andrew Smith
2 | RA | Ryan Andrews
因为Andrew Smith的代码和名字与“A”匹配,Andre Ryan的姓氏与“A”匹配
到目前为止,我的问题是:
var keyphrase = 'aa';
var employees = await (from e in _dbContext.Employee
where EF.Functions.Like(e.Code, $"{keyphrase}%")
orderby e.Code ascending
select e).ToListAsync();
这对于针对代码进行搜索非常有效。但我不知道如何将关键字短语与name列中的名字和姓氏匹配。同样,我不想做一个Contains,而是StartsWith
我使用的是EF core 3.1
非常感谢您的帮助。这里有一个Nuget包方式,如果您需要这些类,也可以从Git Hub获取源代码: Nuget:DataJuggler.UltimateHelper.Core
using DataJuggler.Core.UltimateHelper;
using DataJuggler.Core.UltimateHelper.Objects;
// set the text
string text = "For a good night's sleep before bed, avoid caffiene.";
// split into lines if needed
List<TextLine> lines = WordParser.GetTextLines(text);
// verify the lines exist and have one or more items
if (ListHelper.HasOneOrMoreItems(lines))
{
// Iterate the collection of TextLine objects
foreach (TextLine textLine in lines)
{
// get the words
List<Word> words = WordParser.GetWords(textLine.Text);
// If the words collection exists and has one or more items
if (ListHelper.HasOneOrMoreItems(words))
{
// Iterate the collection of Word objects
foreach (Word word in words)
{
if (word.Text.ToLower().StartsWith("a"))
{
// do something for a
}
else if (word.Text.ToLower().StartsWith("b"))
{
// do something else for b
}
else if (word.Text.ToLower().StartsWith("c"))
{
// do something else for c
}
}
}
}
}
使用DataJuggler.Core.UltimateHelper;
使用DataJuggler.Core.UltimateHelper.Objects;
//设置文本
string text=“要想在睡前睡个好觉,就不要喝咖啡。”;
//如果需要,可以分成几行
List lines=WordParser.GetTextLines(text);
//验证行是否存在并具有一个或多个项
if(ListHelper.HasOneOrMoreItems(行))
{
//迭代TextLine对象的集合
foreach(文本行文本行中的文本行)
{
//明白了吗
List words=WordParser.GetWords(textLine.Text);
//如果单词集合存在并且有一个或多个项
if(ListHelper.HasOneOrMoreItems(words))
{
//迭代Word对象的集合
foreach(单词中的单词)
{
if(word.Text.ToLower().StartsWith(“a”))
{
//为一个孩子做点什么
}
else if(word.Text.ToLower().StartsWith(“b”))
{
//为b做点别的
}
else if(word.Text.ToLower().StartsWith(“c”))
{
//为c做些别的事情
}
}
}
}
}
如果没有多行,可以跳过解析行部分,但是我已经使用这个类很多年了,我非常喜欢它
完整的源代码在Nuget上:
StartsWith
应与EF Core一起使用-它被转换为SQL格式,类似于带有尾部%
的SQL。我建议使用它,并且包含:
var keyphrase = 'aa';
var employees = await (from e in _dbContext.Employee
where e.Code.StartsWith(keyphrase) || e.Name.StartsWith(keyphrase) || e.Name.Contains($" {keyphrase}")
orderby e.Code ascending
select e).ToListAsync();
假设在要检查的每个术语之前都使用空格(”
),则可以使用以下技巧:
where EF.Functions.Like(" " + e.Name, "% " + keyphrase + "%")
其中EF.Functions.Like(“+e.Name,%”+keyphase+“%”)
请注意列值和关键字短语前面的空格。列前的空格用于处理列值开头的关键字短语
或者,您可以使用两个单独的条件来匹配起始术语和中间术语:
where EF.Functions.Like(e.Name, keyphrase + "%")
|| EF.Functions.Like(e.Name, "% " + keyphrase + "%")
其中EF.Functions.Like(e.Name,keyphase+“%”)
||EF.Functions.Like(e.Name,“%”+关键字短语+“%”)
LINQtoSQL不是实体框架,您可以考虑更改标题标题和标签。@ CURCODECOM删除标签。谢谢姓氏不能使用StartWIth
,因为它不在开头。您可能需要考虑将第一个和最后一个名字分成单独的列。只需知道使用这样的技术就需要将整个表拉到客户端。我能在LINQ查询中使用这个表吗?LINQ抱怨在runitme上转换字符串操作,如StartsWith(),这导致我首先使用EF.函数。@Crowcoder我想避免具体化整个集合,因为我处理了大量记录,我想在API调用中对多个数据集执行此操作。@PrashantTiwari,是的,我想这就是我发表评论的原因。我希望比我功夫更厉害的人会回答。问题在于编写一个表达式,提供程序可以将其转换为SQL,如果您了解SQL,那么与C#中的API相比,字符串操作有些原始。@Crowcoder非常感谢。我会认为这是最后一招。同时,我认为我可以找到一个类似SQL的查询来执行同样的操作,并在EF.Functions方法中使用它。再一次,非常感谢兄弟。如果StartsWith没有翻译,至少在最新的夜间版本中,这是EfCore团队的新低-这就像是一个标准的操作,如果有的话。在3.1版本中,这很可能是isa的错误,因为在sql siide处理中,这是一个令人讨厌的错误。这正是我想要的!