Как динамически выбрать имя столбца DbSet? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть следующие 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 { .... }

Я хочу создать обобщенную c функцию с двумя параметрами типа для класса сущности тип данных столбца и строковый параметр для имени столбца. Функция вернет

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;
}

1 Ответ

1 голос
/ 16 марта 2020

В этой ссылке (https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/) вы можете увидеть, как создать лямбда-выражение из строки. Там он использует пример в 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 () для вашего тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...