如何动态地select DbSet 列名?
How to dynamically select the DbSet column name?
我有以下DbContext
和实体(.Net core 3.11控制台程序)。
public partial class MyDbContext : DbContext
{
private readonly string _connectionString;
public MyDbContext(string connectionString) => _connectionString = connectionString;
public DbSet<MyEntity1> MyEntity1 { get; set; }
public DbSet<MyEntityX> MyEntityX { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder.UseSqlServer(_connectionString);
}
public class MyEntity1 { .... }
public class MyEntityX { .... }
我想创建一个泛型函数,其中两个类型参数用于实体 class 和列数据类型,一个字符串参数用于列名。该函数将 return
List<TColumn> F<TEntity, TColumn>(string colName)
{
var list = dbContext.Set<TEntity>()
.Select(x => x."colName?") // need to dynamic select the value of column
.ToList();
return list;
}
在此 link (https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/) 中,您可以了解如何从字符串创建 lambda 表达式。在那里,他在 Where() 中使用了一个示例,但您应该能够创建一个 Select() 表达式,例如
var selectString = "x => x.colName";
var options = ScriptOptions.Default.AddReferences(typeof(TEntity).Assembly);
Func<TEntity, bool> selectExpression = await CSharpScript.EvaluateAsync<Func<TEntity, bool>>(selectString, options);
var selectedData = dbContext.Set<TEntity>().Select(selectExpression);
注意:您必须始终记住为您的类型使用 AddReferences() 的选项。
我有以下DbContext
和实体(.Net core 3.11控制台程序)。
public partial class MyDbContext : DbContext
{
private readonly string _connectionString;
public MyDbContext(string connectionString) => _connectionString = connectionString;
public DbSet<MyEntity1> MyEntity1 { get; set; }
public DbSet<MyEntityX> MyEntityX { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder.UseSqlServer(_connectionString);
}
public class MyEntity1 { .... }
public class MyEntityX { .... }
我想创建一个泛型函数,其中两个类型参数用于实体 class 和列数据类型,一个字符串参数用于列名。该函数将 return
List<TColumn> F<TEntity, TColumn>(string colName)
{
var list = dbContext.Set<TEntity>()
.Select(x => x."colName?") // need to dynamic select the value of column
.ToList();
return list;
}
在此 link (https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/) 中,您可以了解如何从字符串创建 lambda 表达式。在那里,他在 Where() 中使用了一个示例,但您应该能够创建一个 Select() 表达式,例如
var selectString = "x => x.colName";
var options = ScriptOptions.Default.AddReferences(typeof(TEntity).Assembly);
Func<TEntity, bool> selectExpression = await CSharpScript.EvaluateAsync<Func<TEntity, bool>>(selectString, options);
var selectedData = dbContext.Set<TEntity>().Select(selectExpression);
注意:您必须始终记住为您的类型使用 AddReferences() 的选项。