Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将SQL Server的CONTAINS()作为模型定义函数导入_Sql Server_Entity Framework_Entity Framework 4.1_Full Text Search - Fatal编程技术网

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

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) &

我正在尝试在实体框架模型中导入SQL Server的CONTAINS函数,以便在LINQ查询中使用它

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

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