2013-07-02 18 views
8

Jak mogę wykonać LINQ do łączenia SQL bez dokładnego dopasowania? Na przykład powiedzmy, że mam tabelę form z danymi John Smith (2) i chcę dołączyć do tego pola Smith w tabeli name. Coś takiegoUżyj zawiera w LINQ do SQL dołączyć

var query = 
    from f in db.form 
    join n in db.name 
     on f.nameField like '%' + n.firstName + '%' 

Chociaż kluczowe like nie wydaje się być dla mnie dostępne.

Odpowiedz

9

Nie można użyć like w łączeniu Linq. W rzeczywistości nie można w ogóle używać like w Linq, tylko konwencjonalne metody łańcuchowe, takie jak StartsWith, EndsWith lub Contains.

Trzeba by zrobić coś takiego:

var query = 
    from f in db.form 
    from n in db.name.Where(x => f.nameField.Contains(x.firstName)) 
    ... 
+1

Nie wiem, czy to jakiś dziwny błąd implementacji w moim kodzie, czy nie, ale to dało mi błąd: 'Tylko argumenty, które można ocenić na kliencie są su pported dla metody String.Contains. "Mam to do pracy używając' IndexOf' zamiast 'Contains' jak szczegółowe [tutaj] (http://stackoverflow.com/a/7574433/1080891) –

+0

@CavynVonDeylen Hmm, to wydaje się być ograniczeniem Linq-SQL. 'string.Contains' jest standardowym mechanizmem w innych ORMach. –

+1

@CavynVonDeylen można spróbować wykonać następujące 'od n w db.name.ToList(). Gdzie (x => f.nameField.Contains (x.firstName))'. Metoda '.ToList()' ocenia zestaw encji i umieszcza wszystko z bazy danych w pamięci. W ten sposób można użyć metody 'string.Contains()'. Po prostu bądź świadomy i nie oceniaj jednocześnie wszystkich obiektów w swoim stole. –

5

Faktycznie, istnieje a way of doing it, ale to nie jest tak czysty, jak przy użyciu standardowego linq rzeczy:

from c in dc.Organization 
where SqlMethods.Like(c.Hierarchy, "%/12/%") 
select *; 

(zapożyczona z odpowiedź użytkownika LP w połączonym pytaniu)

+1

+1 Dobrze, to zadziała, ponieważ OP używa Linq-SQL. W większości innych przypadków ta metoda nie będzie tłumaczona. –

+1

@ p.s.w.g prawda! należy wspomnieć, że jest to ściśle linq-sql. – Chris