linq2db / linq2db.EntityFrameworkCore

Bring power of Linq To DB to Entity Framework Core projects
MIT License
462 stars 38 forks source link

`Contains()` with `varchar` column #157

Closed exytab closed 3 years ago

exytab commented 3 years ago

Hi,
I try to select entities by the additional property, but I have some problems with performance with generated code.
I have a simple table with 2 columns. Second column (ExtId) has type varchar(50). But generated SQL use parameters like nvarchar

public class Post
{
  public int Id { get; set; }
  public string ExtId { get; set; }
}

public class Context : DbContext
{
  public virtual DbSet<Post> Post { get; set; }

  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
    modelBuilder.Entity<Post>(entity =>
    {
      entity.Property(e => e.ExtId)
            .HasMaxLength(50)
            .IsUnicode(false);
     });
  }
}

var extIds = new List<string> { "1", "2" };
var posts = ctx.Where(p => extIds.Contains(p.ExtId)).ToLinqToDB().ToList();

Generated SQL:

SELECT [p].[Id], [p].[ExtId]
FROM [Post] [p]
WHERE [p].[ExtId] IN (N'1', N'2')

Expected SQL:

SELECT [p].[Id], [p].[ExtId]
FROM [Post] [p]
WHERE [p].[ExtId] IN ('1', '2')

Environment details:

Microsoft.EntityFrameworkCore: 5.0.7 linq2db.EntityFrameworkCore: 5.3.1 linq2db.SqlServer: 3.4.0

sdanyliv commented 3 years ago

Thanks for reporting. Will check.