繁体   English   中英

where子句中的扩展方法

[英]Extension method in a where clause

我在字符串类型上创建了一个简单的扩展方法:

public static bool Contains(this string word, string[] values)
{
    foreach(string s in values)
    {
        if(!word.Contains(s))
            return false;
    }

    return true;
}

现在,我有一个linq查询,如下所示:

public static IEnumerable<ISearchable> Search(params string[] keywords)
{
    XPQuery<Customer> customers = new XPQuery<Customer>(unitOfWork); // **
    var found = from c in customers
                where c.Notes.Contains(keywords)
                select c;

    return found.Cast<ISearchable>();
}

我在where子句上收到“不支持方法”异常,如果我使用string.Contains方法,该异常将正常工作。

我的扩展方法或在linq where子句中尝试使用它的方式有问题吗?

** XPQuery是一个devexpress组件,因为这是我正在使用的ORM,这是它们的linq-to-xpo查询对象。

您的代码是合法的C#,但您使用的框架可能不支持该代码。 您可以尝试以下方法:

where keywords.All(keyword => c.Notes.Contains(keyword))

我还建议您将方法重命名为ContainsAll以使其与ContainsAny区别。

我的猜测是,linq-to-xpo不会像linq-to-entities v1.0(EF)不支持contains一样支持contain,但是linq-to-sql确实支持它。

这是实体框架的解决方法,也许您可​​以尝试一下。 使用Linq to Entities的“ Contains()”解决方法?

LINQ-to-XPO尝试解析您的查询表达式并将其转换为SQL(或任何需要的格式),但它无法理解对自定义方法的调用。

通常,您需要重写查询以摆脱自定义方法(请参阅Mark的答案),或者可以拆分查询以获取一些初步数据,然后使用LINQ-to-Objects与您的查询选择所需的集合。方法。 前者通常在性能方面更好。

我不了解XPQuery ,但我想它使用表达式树并将其转换为其他语言(例如,诸如LINQ to SQL之类的东西,会生成SQL)。 问题在于该库不知道您的扩展方法。 它不知道应该代替您的方法生成什么相应的代码(目标语言)。

通常,没有任何一个框架(如LINQ to SQL等)不支持在查询中使用自定义方法-因为它们无法在方法的“内部”查看如何进行翻译,因此您必须使用来直接编码逻辑支持的方法(标准LINQ运算符)。 Mark的解决方案展示了如何执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM