Postgresql ToLower位于数组中。包含在实体框架核心中

Postgresql ToLower位于数组中。包含在实体框架核心中,postgresql,entity-framework,entity-framework-core,Postgresql,Entity Framework,Entity Framework Core,在EF Core的查询中,比如myContext.Books.Where(b=>new[]{“哈利波特”,“魔戒”}.Contains(b.Title.ToLower())过滤部分没有在sql server上执行,没有构建“Where”close。我正在使用postgresql和npgsql驱动程序,但我已经检查了ms sql server是否也有相同的行为。 那么,您知道是否有可能构建一个将生成如下sql where子句的查询(对于postgresql): 在《哈利波特》、《指环王》中的较低位

在EF Core的查询中,比如
myContext.Books.Where(b=>new[]{“哈利波特”,“魔戒”}.Contains(b.Title.ToLower())
过滤部分没有在sql server上执行,没有构建“Where”close。我正在使用postgresql和npgsql驱动程序,但我已经检查了ms sql server是否也有相同的行为。 那么,您知道是否有可能构建一个将生成如下sql where子句的查询(对于postgresql):
在《哈利波特》、《指环王》中的较低位置(标题)

你的linq声明似乎有点不适合进行松散匹配

class Program
  {
    static void Main(string[] args)
    {
      var contextMock = new List<Book>
      {
        new Book(1, "Harry Potter and The Sorcerer's Stone", "Fiction"),
        new Book(2, "Harry Potter and The Secret Chamber", "Fiction"),
        new Book(3, "Dune", "Fiction"),
        new Book(4, "The Lord of The Rings The Fellowship of the Ring", "Fiction"),
        new Book(5, "The Lord of The Rings Return of the King", "Fiction"),
        new Book(6, "A Brief History of Time", "NonFiction")
      };


      var wrong = contextMock.Where(x => (new[]{ "harry potter", "the lord of the rings" }).Contains(x.Title.ToLower())).ToList();
      var right = contextMock.Where(x => (new List<string> { "harry potter", "the lord of the rings" }).Any(y => x.Title.ToLower().Contains(y.ToLower()))).ToList();

      Console.ReadLine();
    }
  }
类程序
{
静态void Main(字符串[]参数)
{
var contextMock=新列表
{
新书(1,《哈利波特与魔法石》,《小说》),
新书(2,《哈利波特与密室》,《小说》),
新书(3,“沙丘”、“小说”),
新书(4,《指环王与指环团契》,《小说》),
新书(5,《指环王归来》,《小说》),
新书(6,“时间简史”,“非小说类”)
};
var-horror=contextMock.Where(x=>(新[]{“哈利波特”,“指环王”})。包含(x.Title.ToLower()).ToList();
var right=contextMock.Where(x=>(新列表{“哈利波特”,“指环王”})。任意(y=>x.Title.ToLower()。包含(y.ToLower())).ToList();
Console.ReadLine();
}
}

您遇到了核心SQL翻译的限制。在1.1.2版之前,EF core假设在
数组.Contains(item)
中,
item
将是成员表达式或
EF.Property
方法调用,指示属性访问。但在您的情况下,您有一个不同的方法调用,因为您正在调用
ToLower()
,因此EF Core无法识别模式,并且不会将
包含的内容转换到服务器

顺便说一句,在修复不同版本时,此限制被删除。 如果可能的话,现在EF核心翻译
项目
。由于
ToLower()
是可以翻译的,所以它可以正确工作并在
语句中生成
。该问题已在2.0.0-1中修复。因此,它应该在EF Core的2.0版本中可用

我使用EF Core的2.0.0夜间版本测试了该查询。下面是生成的SQL

SELECT [x].[Id], [x].[Title]
FROM [Blogs] AS [x]
WHERE LOWER([x].[Title]) IN (N'harry potter', N'the lord of the rings')

这没用。正如我所写的,我希望EF生成sql,在('harry potter','the lower of the rings')中使用
下(title)
,但现在它只生成
选择。。。从…
获取整个表,然后在内存中进行筛选。???除非覆盖T4模板,否则EF不会生成查询。Postgresql只是数据库的一种风格。除非你有其他的npgsql只是一个驱动程序。因此,如果没有更多的数据,你只会给出一个谓词,无论你把它放在哪里,它都是错误的,因为你的意图是失去匹配。如果是在某个地方生成的,您没有提供该详细信息。我刚刚看到了linq'.Where(b=>…)',并发现它的意图是错误的。