【发布时间】:2020-03-30 07:51:54
【问题描述】:
在 EF Core 中是否有等效的 IsNumeric 或使用 linq 或 Dynamic Sql 或类似的?
我试图仅从 nvarchar 列中获取具有数值的行。
【问题讨论】:
在 EF Core 中是否有等效的 IsNumeric 或使用 linq 或 Dynamic Sql 或类似的?
我试图仅从 nvarchar 列中获取具有数值的行。
【问题讨论】:
现在已将其添加到 EF Core,它看起来像是 EF Core 6.0 的一部分 - https://github.com/dotnet/efcore/issues/23114
【讨论】:
你可以使用Raw SQL Queries
安全提示:Always use parameterization for raw SQL queries
鉴于此数据集/结果:
EF Core 的实体类:Sandbox.cs
public class Sandbox
{
public int SandboxId { get; set; }
public string StringOrNumber { get; set; }
}
在您的上下文中创建一个 DbSet:
public DbSet<Sandbox> Sandboxes { get; set; }
标记为无键:
modelBuilder.Entity<Sandbox>().HasNoKey();
测试:
public async Task<IList<Sandbox>> GetNumberList()
{
// 1 = number, 0 = string
var isNumeric = new SqlParameter("isNumeric", 1);
var listOfNumbers = await _context.Sandboxes
.FromSqlRaw("SELECT SandboxId, StringOrNumber FROM dbo.Sandbox WHERE ISNUMERIC(StringOrNumber) = @isNumeric", isNumeric)
.ToListAsync();
return listOfNumbers;
}
FromSqlRaw 的替代方案是FromSqlInterpolated。
var listOfNumbers = await _context.Sandboxes
.FromSqlInterpolated($"SELECT SandboxId, StringOrNumber FROM dbo.Sandbox WHERE ISNUMERIC(StringOrNumber) = {isNumeric}")
.ToListAsync();
【讨论】: