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)
我意识到我定义的函数没有直接链接到被查询的实体集,所以这也可能是一个问题.
有什么办法可以解决这个问题吗?
您上面定义的函数使用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。
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |