将SQL Server的CONTAINS()导入为模型定义的函数

Xav*_*nas 35 sql-server full-text-search entity-framework entity-framework-4.1

我试图在我的Entity Framework模型中导入SQL Server的CONTAINS()函数,以便我可以在我的LINQ查询中使用它.

我已将此添加到我的EDM中:

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

添加创建我的方法存根:

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

我试着像这样调用函数:

from product in Products
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)")
select product
Run Code Online (Sandbox Code Playgroud)

引发以下异常:

The query syntax is not valid. Near term '*'
Run Code Online (Sandbox Code Playgroud)

我意识到我定义的函数没有直接链接到被查询的实体集,所以这也可能是一个问题.

有什么办法可以解决这个问题吗?

Mic*_*haC 3

您上面定义的函数使用Entity SQL,而不是Transact SQL,所以我认为第一步是弄清楚CONTAINS(*,'text')是否可以用Entity SQL表示。

实体 SQL 不支持 * 运算符,如下所述:http://msdn.microsoft.com/en-us/library/bb738573.aspx如果我尝试

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

我得到了与上面相同的错误。如果我尝试显式传递该列,它会起作用:

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

但是当我查看 SQL 时,它会将其转换为 LIKE 表达式。

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]"
Run Code Online (Sandbox Code Playgroud)

如果无法使用 Entity SQL 表达查询,则必须使用存储过程或其他机制来直接使用 Transact SQL。