Создайте динамический запрос, принимающий любую сущность - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать запрос с помощью LINQ, а затем хочу назначить сгенерированный запрос классу сущностей.Например, у меня есть три объекта с одинаковыми столбцами.

  • A |Имя, Фамилия
  • B |Имя, Фамилия
  • C |Имя, Фамилия

Например, я могу сгенерировать Linq Where Closures, выполнив сначала переменную, которая содержит выборку объекта.

var lQuery = A.Select(t => t);

Затем я добавлю замыкания, если Имяили LastName не является нулевым

if (!string.IsNullOrEmpty(pName))
{
    lQuery = lQuery.Where(x => x.Name == pName);                    
}
if (!string.IsNullOrEmpty(pLastName))
{
    lQuery = lQuery.Where(x => x.LastName == pLastName);
}

И, наконец, я возвращаю список A из сгенерированного lQuery.

Есть ли способ сгенерировать запрос и затем назначить его в концеодна из моих сущностей?

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете сделать следующее:

public async Task<List<object>> GetFilteredEntityList(string entityClassName, string name, string lastName)
{
      var type = Assembly.GetExecutingAssembly()
                .GetTypes()
                .FirstOrDefault(t => t.Name == entityClassName);

      if (type != null)
      {
         DbSet dbSet = _dbContext.Set(type);

         IQueryable entityListQueryable = dbSet;
         if (!string.IsNullOrEmpty(name))
         {
              entityListQueryable = entityListQueryable.Where("Name == @0", name);
         }

         if (!string.IsNullOrEmpty(lastName))
         {
              entityListQueryable = entityListQueryable.Where("LastName == @0", lastName);
         }

         return await entityListQueryable.ToListAsync();
     }
     else
     {
        throw new Exception("Table name does not exist with the provided entity class name");
     }
}

И Универсальная версия вышеуказанного метода:

public class FilterEntity<TEntity> where TEntity: class
{
    YourDbContext _dbContext = new YourDbContext();
    public async Task<List<TEntity>> GetFilteredEntityList(string name, string lastName)
    {
        DbSet<TEntity> dbSet = _dbContext.Set<TEntity>();

        IQueryable<TEntity> entityListQueryable = dbSet;
        if (!string.IsNullOrEmpty(name))
        {
            entityListQueryable = entityListQueryable.Where("Name == @0", name);
        }

        if (!string.IsNullOrEmpty(lastName))
        {
            entityListQueryable = entityListQueryable.Where("LastName == @0", lastName);
        }

        return await entityListQueryable.ToListAsync();
    }
}

И использование:

List<Teacher> teachreList = await new FilterEntity<Teacher>().GetFilteredEntityList("Tanvir", null);

Примечание. Не забудьте установить System.Linq.Dynamic из Nuget

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