EF Core 2.1 ha aggiunto il supporto per FREETEXT
, come discusso anche in Come utilizzare FreeText in EF core 2.1 . Ho un problema diverso, tuttavia, utilizzando EF Core 2.2: FREETEXT
EF Core supporta entità figlio?
public class Customer
{
public Name Name { get; set; }
public List<Address> Addresses { get; set; }
}
Il nome è un'entità posseduta (oggetto valore), che funziona perfettamente per la ricerca:
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
L'indirizzo è un'entità figlio:
public class Address
{
public string Street { get; set; }
public string Number { get; set; }
}
Questa ricerca funziona bene:
query.Where(c => EF.Functions.Freetext(c.Name.FirstName, searchTerm) || EF.Functions.Freetext(c.Name.LastName, searchTerm)
Questa ricerca no, poiché il termine finale non può essere tradotto in SQL:
query.Where(c => EF.Functions.Freetext(c.Name.FirstName, searchTerm) || EF.Functions.Freetext(c.Name.LastName, searchTerm) || EF.Functions.Freetext(c.Addresses.First().Street, searchTerm)
C'è un modo per aggirare questo, o dovrò usare una funzione SQL? Ho provato a utilizzare un'istruzione Select()
, ma non è stato possibile tradurre completamente in SQL.
Trovato! Apparentemente, EF.Functions.FreeText(c.Addresses.First().Street, searchTerm)
non può essere valutato sul lato client. Tuttavia, questo può:
EF.Functions.FreeText(c.Addresses.Any(a => EF.Functions.FreeText(a.Street, searchTerm))
Quindi assicurati che EF.Functions.FreeText()
riceva una string
semplice come prima proprietà e usa qualsiasi altro LINQ per selezionare First()
, 'Last ()', Any()
e All()
delle entità figlio.
I documenti per il metodo FREETEXT di EF Core 2.1 indicano che la valutazione del cliente non è consentita. Non ci sono ancora documenti per EF Core 2.2, ma presumo che non sia cambiato.
Questo metodo DbFunction non ha un'implementazione in memoria e verrà generato se la query passa alla valutazione client.
Ciò può accadere se la query contiene una o più espressioni che non è stato possibile tradurre nel negozio.
Altrimenti, potresti prendere in considerazione l'aggiunta di una proprietà sul Cliente, su cui puoi eseguire una query direttamente, se è davvero importante utilizzare FREETEXT. Per esempio
public class Customer
{
public Name Name { get; set; }
public List<Address> Address { get; set; }
public string DefaultStreet { get; set; }
}
Presumo che gli indirizzi siano in un elenco, basato sulla tua domanda.