MySQL.Data.EntityFrameworkCore8和Microsoft.EntityFrameworkCore.Relational 2.2.6是否支持Contains()方法

disho6za  于 2023-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(147)

Nuget lib使用MySQL.Data.EntityFrameworkCore 8Microsoft.EntityFrameworkCore.Relational 2.2.6。我使用的mysql数据库与实体框架的核心,并不确定包含方法在linq是直接支持的entityframwork核心或没有我有巨大的记录和大量的交通对我的网站担心它会加载记录在内存中,然后做包含搜索

return await dbContext.Table
    .Where(x => x.Url.Contains(somestring))
    .Select(x => x.Field)
    .ToListAsync();
qyyhg6bp

qyyhg6bp1#

当然它可以支持Contains(),这里是一个简单的查询:

_dbcontext.TestModels.Where(x => x.Name.Contains("ac")).ToList();

现在我将记录ef核心在dbcontext中生成的sql

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.LogTo(x =>
            {
                Console.WriteLine(x);
            });
        }

检查日志文件

你可以找到它生成正确的sql。但是如果我把.Tolist()方法放在查询条件前面,查询如下:

_dbcontext.TestModels.ToList().Where(x => x.Name.Contains("ac"));

检查日志文件

它不会在sql中添加任何查询条件,这就是你所担心的获取内存中的所有数据进行过滤。
你可以参考这个link来了解IQueryable<T>IEnumerable<T>的区别,它会让你对这个问题有更多的了解。

yhived7q

yhived7q2#

软件包和版本混合在一起,现在已经停产了。查询不起作用的原因是您试图在EF Core 2中使用EF Core 3提供程序。
解决方案是完全删除Oracle的提供程序,并添加与您使用的EF Core版本匹配的Pomelo.EntityFrameworkCore.MySql版本。请记住,EF Core版本为follow the .NET Core support plan。目前,最早支持的.NET Core版本是.NET 6,因此最早支持的EF Core版本是EF Core 6。

详情

Oracle的MySql.Data.EntityFrameworkCore在3年前就停产了,因为它有太多的问题,而且维护得很差。它被MySql.EntityFrameworkCore取代,但即使这样也有很多问题,以至于人们不使用Oracle的提供程序。
其次,该包的Dependencies页面显示它至少需要Microsoft.EntityFrameworkCore.Relational v3.1.1。这是EF Core 3.1的一部分,它太老了,也停产了。Microsoft.EntityFrameworkCore.Relational v2.2.6是EF Core 2.2的一部分,于2019年12月23日停止使用
最后,Oracle的提供程序有足够多的问题,以至于人们压倒性地更喜欢使用真正的开源Pomelo.EntityFrameworkCore.MySql及其MySqlConnector ADO.NET提供程序。
数字甚至不接近:Pomelo的下载量为4200万,Oracle提供商的下载量为800万 *。如果你只与“新”包(2020年发布)进行比较,它的42M与3M。

相关问题