Existe alguma maneira de comparar strings em uma expressão C # LINQ semelhante ao LIKE
operador SQL ?
Suponha que eu tenha uma lista de cordas. Nesta lista, desejo pesquisar uma string. Em SQL, eu poderia escrever:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
Em vez do acima, a consulta deseja uma sintaxe linq.
using System.Text.RegularExpressions;
…
var regex = new Regex(sDischargePort, RegexOptions.IgnoreCase);
var sPortCode = Database.DischargePorts
.Where(p => regex.IsMatch(p.PortName))
.Single().PortCode;
Minha sintaxe LINQ acima não funciona. O que eu entendi de errado?
Respostas:
Normalmente você usa
String.StartsWith
/EndsWith
/Contains
. Por exemplo:Não sei se existe uma maneira de fazer expressões regulares adequadas por meio do LINQ to SQL. (Observe que realmente depende de qual provedor você está usando - seria ótimo no LINQ to Objects; é uma questão de o provedor poder converter a chamada em seu formato de consulta nativo, por exemplo, SQL.)
EDIT: Como diz o BitKFu,
Single
deve ser usado quando você espera exatamente um resultado - quando é um erro não ser o caso. Opções deSingleOrDefault
,FirstOrDefault
ouFirst
deve ser usado dependendo exatamente o que se espera.fonte
Single()
,SingleOrDefault()
seria meu próximo passo, a menos que entendamos todo o contexto ...Regex? não. Mas para essa consulta, você pode apenas usar:
Se você realmente deseja SQL
LIKE
, pode usarSystem.Data.Linq.SqlClient.SqlMethods.Like(...)
, para qual LINQ para SQL mapeiaLIKE
no SQL Server.fonte
Bem ... às vezes pode ser desconfortável de usar
Contains
,StartsWith
ouEndsWith
especialmente ao pesquisar o valor, determinar aLIKE
instrução, por exemplo, o 'valor%' passado requer do desenvolvedor para usar aStartsWith
função na expressão. Então decidi escrever extensão paraIQueryable
objetos.Uso
Código
fonte
IEnumerable
?Como Jon Skeet e Marc Gravell já mencionaram, você pode simplesmente pegar uma condição contém. Mas no caso de sua consulta like, é muito perigoso usar uma instrução Single (), porque isso implica que você encontrará apenas 1 resultado. No caso de mais resultados, você receberá uma boa exceção :)
Então, eu preferiria usar FirstOrDefault () em vez de Single ():
fonte
No LINQ nativo, você pode usar a combinação de
Contains/StartsWith/EndsWith
ou RegExp.No LINQ2SQL, use o método
SqlMethods.Like()
adicione Assembly: System.Data.Linq (em System.Data.Linq.dll) para usar este recurso.
fonte
StartsWith()
,Contains()
etc, não funcionam com Linq2SQL (pelo menos recebo "A expressão LINQ ... não pôde ser traduzida ..." e uma instrução para usar ToList () para "avaliação de cliente" - que eu ' já estou fazendo. Observe, no EF Core, ele foi movido paraEF.Functions.Like()
Isso funciona como "LIKE" do SQL ...
fonte
Simples assim
Resultado -> Annick, Yannick
fonte
Você pode chamar o método único com um predicado:
fonte
Idealmente, você deve usar
StartWith
ouEndWith
.Aqui está um exemplo:
fonte
fonte
Basta adicionar métodos de extensão de objeto de string.
uso:
fonte
fonte