繁体   English   中英

Linq to entity 不生成 where 子句

[英]Linq to entities is not generating a where clause

这很奇怪,以前从未见过这样的东西。 我有一个我有一段时间没有接触过的旧项目,它的设置使用 Linq to Entities 和代码优先。 我尝试从作品中选择数据的每个实体,但生成的 SQL 不包含 where 子句。 (我可以看到在 SQL Profiler 中生成了什么)所以应用程序基本上是从表中选择所有行,然后在服务器上进行过滤,这并不好。 我的项目是使用Microsoft.EntityFrameworkCore程序集版本2.2.6.0 .Net Core 2.2

我觉得这可能是某些东西的错误配置,但我没有看到任何错误。 有没有人见过这样的事情?

不管这个问题是什么,当我试图保存一个国家实体时,它也会给我带来这个例外; 这是没有意义的,因为 CountryId 是下面代码优先设置中的主键,我绝对没有分配它。

Cannot insert explicit value for identity column in table 'Country' when IDENTITY_INSERT is set to OFF.

我尝试了不同的选择变体,但没有一个生成 where 子句。

var country = await _taxContext.Countries
    .FirstOrDefaultAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode, StringComparison.OrdinalIgnoreCase))
    .ConfigureAwait(false);

-- generates this sql
SELECT [a].[CountryId], [a].[Name], [a].[TwoLetterISOCode]
FROM [dbo].[Country] AS [a]

var exists = await _taxContext.Countries
    .AnyAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode, StringComparison.OrdinalIgnoreCase))
    .ConfigureAwait(false);

-- generates this sql
SELECT [a].[TwoLetterISOCode]
FROM [dbo].[Country] AS [a]

这是我的国家实体 POCO

public class Country
{
    public byte CountryId { get; private set; }
    public string Name { get; set; }
    public string TwoLetterISOCode { get; set; }

    public ICollection<Nexus> Nexi { get; set; }
}

我的国家配置

class CountryConfiguration : IEntityTypeConfiguration<Country>
{
    public void Configure(EntityTypeBuilder<Country> builder)
    {
        builder.ToTable(nameof(Country), "dbo");

        builder.HasKey(ci => ci.CountryId);

        builder.Property(ci => ci.Name)
            .HasColumnType("nvarchar(75)");

        builder.Property(ci => ci.TwoLetterISOCode)
            .HasColumnType("char(2)");

        builder.HasMany(ci => ci.Nexi)
            .WithOne(ci => ci.Country);
    }
}

和我的 DbContext

public class TaxContext : DbContext
{
    public TaxContext(DbContextOptions<TaxContext> options) : base(options)
    {
    }

    public DbSet<Region> Regions { get; set; }
    public DbSet<Country> Countries { get; set; }
    public DbSet<Nexus> Nexi { get; set; }
    public DbSet<TaxRate> FallbackRates { get; set; }
    public DbSet<CircuitBreakerLog> CircuitBreakerLogs { get; set; }
    public DbSet<AppLog> AppLogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .ApplyConfiguration(new NexusConfiguration())
            .ApplyConfiguration(new RegionConfiguration())
            .ApplyConfiguration(new CountryConfiguration())
            .ApplyConfiguration(new TaxRateConfiguration())
            .ApplyConfiguration(new CircuitBreakerLogConfiguration())
            .ApplyConfiguration(new AppLogConfiguration());
    }
}

启动文件

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TaxContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

您应该在输出中看到 EF 正在本地评估您的查询的警告。 这是因为您的字符串比较。 虽然我将支持使用string.Equals ,但它不支持您使用的重载。 EF 不知道如何处理StringComparison.OrdinalIgnoreCase因为它依赖于大小写、重音等的数据库排序规则。解决方案是使用简单的重载或基本的==

.FirstOrDefaultAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode))

或者

.FirstOrDefaultAsync(a => a.TwoLetterISOCode == country.jurisCode)

暂无
暂无

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

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