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

我想在我的entity framework模型中导入SQL Server的CONTAINS()函数,以便我可以在我的LINQ查询中使用它。

我已经添加到我的EDM:

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

添加创build我的方法存根:

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

我试图调用这样的function:

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

引发以下exception:

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

我意识到我定义的函数并不直接链接到被查询的实体集合,这也可能是一个问题。

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

上面定义的函数使用实体SQL,而不是Transact SQL,所以我认为第一步是确定CONTAINS(*,“文本”)是否可以在实体SQL中expression。

如下所述,实体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')"); 

我得到了上面的错误。 如果我试图显式传递它的工作方式:

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

但是当我看着SQL将它翻译成LIKEexpression式。

 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]" 

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

这是超出我的,但你可以尝试

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

我的推理是在SQL Server中,它期望两个参数。

我在我的代码中插入了一个小的函数,在inheritance自Context类的类中,这个类指向了我的支持全文search的SQL函数,我的解决scheme对于你来说是封闭式的(不允许指定文本typessearch),它返回一个IEnumerable,本质上是一个匹配search条件的主键列表,像这样;

 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();