2013-07-02 12 views
8

Come posso unire LINQ a SQL senza una corrispondenza esatta? Ad esempio, supponiamo di avere un tavolo form con i dati John Smith (2) e voglio unirlo al campo Smith nella tabella name. Qualcosa di simileL'uso contiene in join LINQ to SQL

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

Anche se la parola like non sembra essere a mia disposizione.

risposta

9

Non è possibile utilizzare like in un join Linq. In effetti, non è possibile utilizzare lo standard like in Linq, ma solo metodi convenzionali come StartsWith, EndsWith o Contains.

Avresti per fare qualcosa di simile:

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

Non so se si tratta di un errore di implementazione strano nel mio codice o meno, ma questo mi ha dato un errore: "Solo gli argomenti che possono essere valutati sul client sono su pported per il metodo String.Contains. Ho funzionato usando 'IndexOf' invece di' Contains' come dettagliato [qui] (http://stackoverflow.com/a/7574433/1080891) –

+0

@CavynVonDeylen Hmm, che sembra essere una limitazione di Linq-to-SQL. 'string.Contains' è il meccanismo standard in altri ORM. –

+1

@CavynVonDeylen si può provare a fare il seguente 'da n in db.name.ToList(). Dove (x => f.nameField.Contains (x.firstName))'. Il metodo '.ToList()' valuta l'entità impostata e mette tutto in memoria del database. Facendo ciò, puoi usare il metodo 'string.Contains()'. Basta essere consapevoli e non valutare tutti gli oggetti nella tabella in una sola volta. –

5

In realtà, c'è a way of doing it, ma non è così pulito come utilizzare la roba LINQ di serie:

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

(preso in prestito dalla risposta dell'utente LP nella domanda collegata)

+1

+1 Buon punto, questo funzionerà perché OP sta usando Linq-to-SQL. Nella maggior parte degli altri casi, questo metodo non si tradurrà. –

+1

@ p.s.w.g vero! dovrei averlo detto, questo è strettamente linq-to-sql. – Chris