IQueryable Dynami c set свойство - PullRequest
0 голосов
/ 30 мая 2020

Кто должен устанавливать свойство из выражения соединения

public interface IHiddenEntity
{
  bool Hidden { get; set;}
}
public interface IEntity 
{
   long Id { get; set;}
   string Name { get; set;}
}

public class Entity: IEntity, IHiddenEntity 
{
   public long Id { get; set;}
   public string Name { get; set;}
   public bool Hidden { get; set;}
}

public class Hidden 
{
   public string TableName {g et; set; }
   public long RecordId { get; set; }
}

public class Person: Entity{ ... }


public IQueryable<T> All(bool loadHidden = false)
  where T : class, IEntity, IHiddenEntity 
{
    string tableName = "<T> name";
    return from x in Context.Set<T>()
           join h in Context.Set<Hidden>().Where(record => record.TableName == tableName) on x.Id equals h.RecordId into hr
            from h_r in hr.DefaultIfEmpty()
            where loadHidden ? true : h_r == null
            select x;
}

Но я не могу понять, как установить значение в поле Hidden .

  1. Нужно возвращать только IQueryable, потому что все еще есть условия для выполнения метода.
  2. Также невозможно преобразовать в IEnumerable: это не окончательное значение (см. Выше).

UDP: Опции для создания выбора для каждой модели отсутствуют рассмотрел - много моделей с огромным количеством полей!

1 Ответ

0 голосов
/ 22 июня 2020

Итак, идею нашел. Создайте обернутый объект с необходимыми свойствами и приведите его к типу сущности после выполнения запроса.

internal EntityWrapper<T>
{
      public T Model { get; set; }
      public bool Hidden { get; set; }
}
public IQueryable<T> All(bool loadHidden = false)
  where T : class, IEntity, IHiddenEntity 
{
    string tableName = "<T> name";
    var query = from x in Context.Set<T>()
           join h in Context.Set<Hidden>().Where(record => record.TableName == tableName) on x.Id equals h.RecordId into hr
            from h_r in hr.DefaultIfEmpty()
            select new EntityWrapper<T>(){ Model = x, Hidden = h_r != null};

    if(!loadHidden)
        query = query.Where(x => !x.Hidden);
}

И приведите после сборки sql запроса и результатов с обернутым объектом.

    Expression<System.Func<EntityWrapper<T>,T> castFunc = x => x.Select(wr => {wr.Model.Hidden = wr.Hidden; return wr.Model;});

Используйте только объект IEnumerable<EntityWrapper<T>>.


var result = castFunc(<query>.ToList());

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