35

Estoy intentando importar la función CONTAINS() de SQL Server en mi modelo de Entity Framework para poder usarlo en mis consultas LINQ.Importación de CONTAINS() de SQL Server como una función definida por modelo

he añadido esto a mi EDM:

<Function Name="FullTextSearch" ReturnType="Edm.Boolean"> 
    <Parameter Name="Filter" Type="Edm.String" /> 
    <DefiningExpression> 
     CONTAINS(*, Filter) 
    </DefiningExpression> 
</Function> 

Agregar creado mi método talón:

[EdmFunction("MyModelNamespace", "FullTextSearch")] 
public static bool FullTextSearch(string filter) 
{ 
    throw new NotSupportedException("This function is only for L2E query."); 
} 

Trato de llamar a la función como esta:

from product in Products 
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)") 
select product 

La siguiente se produce una excepción:

The query syntax is not valid. Near term '*' 

Me doy cuenta de que la función que he definido no está directamente relacionada con el conjunto de entidades que se está consultando, por lo que también podría ser un problema.

¿Hay alguna manera de lograr esto?

+0

¿Posible duplicado? http://stackoverflow.com/questions/224475/is-it-possible-to-use-full-text-search-fts-with-linq – Pondlife

+2

La solución sugerida en esta pregunta es importar una función con valores de tabla, que funciona para LINQ to SQL pero no (actual) para Entity Framework –

Respuesta

3

La función que ha definido anteriormente utiliza Entity SQL, no Transact SQL, así que creo que el primer paso es averiguar si CONTIENE (*, 'texto') se puede expresar en Entity SQL.

Entity SQL no es compatible con el operador * como se describe aquí: http://msdn.microsoft.com/en-us/library/bb738573.aspx y si intento

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(*, 'text')"); 

me sale el mismo error que tienes encima. Si trato de pasar explícitamente la columna funciona:

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(t.COLUMN_NAME, 'text')"); 

Pero cuando miro el SQL que traduje a una expresión similares.

ADO.NET:Execute Reader "SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    COUNT(1) AS [A1] 
    FROM [dbo].[TABLE_NAME] AS [Extent1] 
    WHERE (CASE WHEN ([Extent1].[COLUMN_NAME] LIKE '%text%') THEN cast(1 as bit) WHEN (NOT ([Extent1].[COLUMN_NAME] LIKE '%text%')) THEN cast(0 as bit) END) = 1 
) AS [GroupBy1]" 

Si no puede expresar la consulta utilizando Entity SQL que tendrá que utilizar un procedimiento almacenado u otro mecanismo para utilizar Transact SQL directamente.

1

Esto está más allá de mí, pero podría intenta

from product in Products where MyModel.FullTextSearch(product, "FORMSOF(INFLECTIONAL, robe)") select product 

Mi razonamiento es que en SQL Server que está a la espera de dos parámetros.

1

He insertado una pequeña función en mi código, en una clase que hereda de la clase Context, que apunta a mi función SQL compatible con la búsqueda de texto completo, mi solución es un poco más cerrada a la tuya (no permite la especificación de el tipo de búsqueda de texto), devuelve un IEnumerable, esencialmente una lista de claves principales que coinciden con los criterios de búsqueda, algo como esto;

public class myContext : DataContext 
{ 

    protected class series_identity 
    { 
      public int seriesID; 

      series_identity() { } 
    }; 

      [Function(Name = "dbo.fnSeriesFreeTextSearchInflectional", IsComposable = true)] 
      protected IQueryable<series_identity> SynopsisSearch([Parameter(DbType = "NVarChar")] string value) 
      { 
       return this.CreateMethodCallQuery<series_identity>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), value); 
      } 

      public IEnumerable<int> Search(string value) 
      { 
       var a = from t1 in SynopsisSearch(value) 
         select t1.seriesID; 

       return a; 
      } 
}; 

uso es algo así como;

myContext context = new myContext(); 

IEnumerable<int> series_identities = (from t1 in context.Search("some term") 
                select t1).Distinct(); 
Cuestiones relacionadas