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