【问题标题】:Contains method for compare string array in C#包含在 C# 中比较字符串数组的方法
【发布时间】:2013-08-14 15:10:00
【问题描述】:

我想使用 LINQ 将字符串字段与字符串数组进行比较,我编写了以下扩展方法进行比较,但它不能正常工作。

 public static bool Contains(this string source, string[] keys)
    {
        foreach (var item in keys)
        {
            if (source.Contains(item))
                return true;
        }

        return false;
    }

这是我的查询:

string[] keys = key.Split('+');
        var pages = context.Pages.Where(x => x.Title.Contains(keys));

我得到的错误是:

LINQ to Entities 无法识别“Boolean”方法 Contains(System.String, System.String[])' 方法,以及这个方法 无法翻译成商店表达式。

【问题讨论】:

    标签: c# linq entity-framework extension-methods linq-expressions


    【解决方案1】:

    您不能像这样在 LINQ 中使用自己的自定义方法 - 但您也许可以使用普通的 LINQ 运算符重写它:

    string[] keys = key.Split('+');
    var pages = context.Pages.Where(x => keys.Any(key => x.Title.Contains(key)));
    

    如果 不起作用,我怀疑它在 EF 中基本上是不可行的。

    【讨论】:

    • 感谢@Jon Skeet 它可以工作:) 但我想知道为什么我的方法不起作用。
    • @Jon Skeet 这在 EF Core 中不起作用,表达式不会被翻译。有什么想法吗?
    • @Nexus:恐怕不会。我对 EF Core 没有任何经验。
    • @JonSkeet 不用担心,非常感谢。如果我没记错的话,这在 EF6 中可以正常工作,但 EF Core 显然缺少一些 LINQ 扩展。
    • 这在最新版本中不再有效....试图找到它什么时候坏了以及修复是什么..在 ef core 5 中没有工作,我确定它在 3.1 中
    【解决方案2】:

    您在Where 中编写的lambda 表达式 实际上是由EF 评估并转换为SQL 的。例如当你写

    db.Pages.Where(x => x.Title == "Hello")
    

    EF 知道将生成的 IQueryable<T> 翻译成类似:

    SELECT ... FROM Pages WHERE title = 'Hello'
    

    同样,它知道一些常用的方法和运算符,例如:

    db.Pages.Where(x => x.Contains("Hello"))
    

    EF 知道将String.Contains 翻译成:

    SELECT ... FROM Pages WHERE title LIKE '%Hello%'
    

    但是,当您将自己的自定义方法与表达式一起使用时,EF 不知道如何将该自定义方法转换为 SQL,这就是它在您看到的错误消息中所抱怨的。

    【讨论】:

      【解决方案3】:

      LINQ to Entities 无法识别“Boolean Contains(System.String, System.String[])”方法,并且该方法无法转换为存储表达式。

      看到你的代码正在被翻译成 SQL,如果我没记错你的错误说 'Boolean Contains(System.String, This method cannot be translate ,这意味着这个特定部分无法翻译将自身转换为 SQL,如果您将字符串转换为 BIT,它可能会起作用。好吧,如果有人觉得我可能走错了方向,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多