Sorgu Yardım(Lambda)
-
Şu regex işini görür:
\s*(car)[^a-zA-Z\d:]
\s* : Başta boşluk olabilir veya olmayabilir.
(car) : "car" sözcüğünü yakalar.
[^a-zA-Z\d:] : Alfanumerik karakterleri kabul etmez.
Yani başında boşluğa izin verecek şekilde sadece car sözcüğü olanları yakalıyor.
Kodda şöyle:
var myRegex=new Regex(@"\s*(car)[^a-zA-Z\d:]"); var model = db.Kelimes.Where(myRegex.IsMatch).ToList();
bkz. http://stackoverflow.com/a/7013655/2946122
Dipnot: Tablo isimlendirmelerinde yarı İngilizce yarı Türkçe isimlendirmeden kaçınmalısın hocam bence, ilerde sinir bozuyor :)
-
Şunu deneyin:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static List<string> saman_ = new List<string>()
{
"by car", "cardanadam", "carlik",
"x car.", "y car z", "car ", "car,"
};
public static bool BenimFiltre(string str)
{
Regex r = new Regex(@"\bcar\b");
return (r.Match(str).Success);
}
static void Main(string[] args)
{
Func<string,bool> filtrefunc = new Func<string, bool>(BenimFiltre);
var sonuc = saman_.Where(e => filtrefunc(e));
foreach (var item in sonuc)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}
-
hocalar Equals işe yaramıyor. Regex ile çözülecek sanırım. denemelerim devam ediyor :)
-
Aşağıdaki gibi deneyebilirsin.
string txt = "car";
var pattern = string.Format(@"\b{0}\b", Regex.Escape(txt));
var re = new Regex(pattern, RegexOptions.IgnoreCase);
var model = db.Kelimes.Where(x => re.IsMatch(x.KelimeAdi)).ToList();
Bu yöntem ile txt değişkenindeki metni \b çapalarıyla sarıp regex testine sokuyorsun.
Aranan kelime ahmet ise şunlarla eşleşir: "ahmet'ten", "(ahmet)", "[ahmet]", "ahmet!", "ahmet."
Şunlarla ise eşleşmez: "zahmet", "ahmetcan", "ahmete", "ahmetten"
Eğer bunu istemiyor, ahmet'in satır baş veya sonlarında veya ortalarda bir yerde ancak boşluk (veya tab vs..) ile çevrili olduğu hallerde eşleşmesini istiyorsan, pattern ve re'yi aşağıdaki gibi değiştir.
var pattern = string.Format(@"(?<=\s|^){0}(?=\s|$)", Regex.Escape(txt));
var re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
Son olarak, eğer büyük-küçük harfe duyarlı bir arama yapmak istiyorsan RegexOptions.IgnoreCase'i kaldırmalısın. -
cemnet bunu yazdı
hocalar Equals işe yaramıyor. Regex ile çözülecek sanırım. denemelerim devam ediyor :)
E @Lightsaber verdi, ben verdim... Olmadı mı?
-
hocalar durum biraz uzadı farkındayım ama aldığım sonuç şu
kod böyle olunca alttaki hatayı alıyorum.
var re2 = new Regex(@"\s*(lives)[^a-zA-Z\d:]");
var model2 = db.Kelimes.Where(x=> re2.IsMatch(x.KelimeAdi)).ToList();
LINQ to Entities does not recognize the method 'Boolean IsMatch(System.String)' method, and this method cannot be translated into a store expression.
----------
Şu şekilde çalıştırdığımda hata almıyorum.
var pattern = string.Format(@"(?<=\s|^){0}(?=\s|$)", Regex.Escape("lives")); var re = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline); var model = db.Kelimes.AsEnumerable().Where(x => re.IsMatch(x.KelimeAdi)).ToList();
ama bu defa da sql profiler dan baktığım zaman tüm tabloyu çekiyor daha sonra kod tarafında arama yapıyor. Tabloda var 3m kayıt. Direk sql tarafında regexli arama yapması lazım.