2017-07-23 10 views
6

Jaki jest najlepszy sposób na wykorzystanie wyszukiwanie pełnotekstowe z EFCoreFull-Text Search z Entity Framework rdzenia

Na razie mam dwa podejścia

podejście # 1

var entities = this.DbContext.Example 
      .FromSql("fullText_Proc {0}, {1}", searchTermParameter, topParameter); 

     return entities.AsNoTracking().ToList(); 

Tutaj Zmuszono do utworzenia proc, ponieważ FromSql ignoruje klauzulę WHERE.

Podejście nr 1

Tworzenie polecenia i wykonaj mapowanie ręcznie

using (var command = this.DbContext.Database.GetDbConnection().CreateCommand()) 
    { 
     command.CommandText = "SELECT ... WHERE CONTAINS("Name", @p1)"; 
     command.CommandType = CommandType.Text; 
     var parameter = new SqlParameter("@p1",...); 

     this.DbContext.Database.OpenConnection(); 

     using (var result = command.ExecuteReader()) 
     { 
      while (result.Read()) 
      { 
       .... // Map entity 
      } 
     } 
    } 
+0

Użyłem waszego drugiego podejścia do pobierania wyników w rankingu z CONTAINSTABLE, którego nie można obecnie uzyskać za pomocą FromSql. Dzięki. – c0y0teX

Odpowiedz

3

WHERE pracuje z FromSql, rzeczywiście. Spędziłem wystarczająco dużo czasu, aby zdać sobie sprawę, że problem był przekazywany przez parametr.

Oto jak rozwiązałem problem.

public IList<Example> QueryPhrase(string phrase) 
    { 
     phrase = $"FORMSOF(FREETEXT, \"{phrase}\")"; 

     var query = _dataContext.Example 
      .FromSql(@"SELECT [Id] 
         ,[Sentence]       
        FROM [dbo].[Example] 
        WHERE CONTAINS(Sentence, @p0)", phrase) 
      .AsNoTracking(); 

     return query.ToList(); 
    } 
+1

Jak zdefiniowałbyś indeks pełnotekstowy w kolumnie "Zdanie" encji "Przykład" z Entity Framework Core? Próbuję zrobić coś podobnego, ale potrzebuję zdefiniowanego indeksu pełnotekstowego, aby kod działał. – VMh

+1

Ja też próbuję zrobić to samo, co @VMh, również chciałbym wiedzieć! –

+0

Nie robisz tego z EF Core. Powinien zostać utworzony najpierw na serwerze Sql, a następnie można zapytać przy użyciu Contains. – mehmetilker