Sql server 将SQL Server的CONTAINS()作为模型定义函数导入
我正在尝试在实体框架模型中导入SQL Server的CONTAINS函数,以便在LINQ查询中使用它 我已将此添加到我的EDM中:Sql server 将SQL Server的CONTAINS()作为模型定义函数导入,sql-server,entity-framework,entity-framework-4.1,full-text-search,Sql Server,Entity Framework,Entity Framework 4.1,Full Text Search,我正在尝试在实体框架模型中导入SQL Server的CONTAINS函数,以便在LINQ查询中使用它 我已将此添加到我的EDM中: <Function Name="FullTextSearch" ReturnType="Edm.Boolean"> <Parameter Name="Filter" Type="Edm.String" /> <DefiningExpression> CONTAINS(*, Filter) &
<Function Name="FullTextSearch" ReturnType="Edm.Boolean">
<Parameter Name="Filter" Type="Edm.String" />
<DefiningExpression>
CONTAINS(*, Filter)
</DefiningExpression>
</Function>
我尝试这样调用函数:
from product in Products
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)")
select product
引发了以下异常:
The query syntax is not valid. Near term '*'
我意识到我定义的函数没有直接链接到被查询的实体集,因此这也可能是一个问题
有什么办法可以做到这一点吗?这是我无法理解的,但你能试试吗
from product in Products where MyModel.FullTextSearch(product, "FORMSOF(INFLECTIONAL, robe)") select product
我的理由是,在SQL Server中,它需要两个参数。我在代码中插入了一个小函数,在一个从上下文类继承的类中,该类指向支持全文搜索的SQL函数,我的解决方案比您的解决方案更封闭,不允许指定文本搜索类型,它返回一个IEnumerable,本质上是一个与搜索条件匹配的主键列表,类似这样
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;
}
};
用法有点像
myContext context = new myContext();
IEnumerable<int> series_identities = (from t1 in context.Search("some term")
select t1).Distinct();
上面定义的函数使用实体SQL,而不是Transact-SQL,因此我认为第一步是确定是否可以用实体SQL表示包含*,'text' 实体SQL不支持此处描述的*运算符:如果我尝试
entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(*, 'text')");
如果无法使用实体SQL表示查询,则必须使用存储过程或其他机制直接使用Transact-SQL 可能重复?这个问题中建议的解决方案是导入一个表值函数,它适用于LINQ到SQL,但不适用于实体框架的currenty
entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(*, 'text')");
entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(t.COLUMN_NAME, 'text')");
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]"