【问题标题】:Entity Framework calling database SQL string functions using Linq?实体框架使用 Linq 调用数据库 SQL 字符串函数?
【发布时间】:2011-08-30 08:01:17
【问题描述】:

如果我想使用 Linq 调用 SQL Server 函数Contains(field,value),我该怎么做?

做类似的事情:

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

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

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

【问题讨论】:

    标签: sql-server linq entity-framework-4 linq-to-entities


    【解决方案1】:

    您可以尝试使用存储功能。 Ladislav Mrnka 在this question 上详细解释了它们。

    基本上,您将在 EDMX 中定义 Contains 并告诉 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 应该正确翻译它。

    【讨论】:

    • 由于某种原因它爆炸了,我什至尝试将参数和硬编码常量删除到定义表达式中..但它仍然说生成的 sql 不正确...想法?
    • 我预计它会爆炸,因为 SQL Server 中的 CONTAINS 不是函数。它是一个谓词。尝试将其包装在自定义函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多