2011-08-30 54 views
2

如果我想使用Linq调用SQL Server函数Contains(field,value),我该如何实现?实体框架调用数据库使用Linq的SQL字符串函数?

做这样的事情:

var result = context.Documents.Where(d => d.SomeField.Contains(param)).ToList(); 

不中生成的SQL查询中使用Contains功能。该字段是启用全文搜索的文本字段。

我知道应该有一些SQL Server字符串函数已经映射到框架的某个地方。是Contains其中之一,我可以在哪里找到它们?

回答

1

您可以尝试使用存储功能。 Ladislav Mrnka在this question解释他们很好。

基本上,您将定义包含在EDMX中,并告诉EF如何映射到SQL Server能够理解的东西(注意:在我的示例中,我将其称为FullTextContains,因此它不会与C#中的Contains方法混淆 - 不敢肯定,如果这是必要与否):

<Function Name="FullTextContains" ReturnType="Edm.String"> 
    <Parameter Name="field" Type="Edm.String" /> 
    <Parameter Name="value" Type="Edm.String" /> 
    <DefiningExpression> 
    Contains(field, value) 
    </DefiningExpression> 
</Function> 

然后您在C#中的存根方法,所以你可以通过LINQ的称之为:

public static class EdmFunctions 
{ 
    [EdmFunction("YourModel", "FullTextContains")] 
    public static string FullTextContains(string field, string value) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

然后你就可以使用Linq查询和EF中的该方法应正确翻译它。

+0

由于某种原因它爆炸,我甚至试图删除参数和硬编码常量到定义表达式..但它仍然说生成的SQL是不正确的...想法? –

+1

我期望它爆炸,因为SQL服务器中的'CONTAINS'不是一个函数。这是一个谓词。尝试将其包装在自定义函数中。 –

相关问题