Общее расширение для сущностей EF - PullRequest
0 голосов
/ 26 августа 2018

Задача: написать общее расширение для сущностей Entity Framework

Я не уверен, возможно ли это вообще из-за того факта, что каждая сущность обычно будет иметь разные свойства, но у меня есть группа сущностей, которые имеют несколько общих свойств, и все, что мне было интересно, можно ли вообще построить универсальное расширение вместо того, чтобы всегда писать один и тот же код для каждой сущности.

Я потратил немного времени на изучение этого, но не так много, что наводит меня на мысль, что это просто невозможно.

В любом случае, вопреки моему лучшему мнению, я собираюсь задать глупый вопрос о StackOverFlow.

Это то, о чем я думал, но, очевидно, это не компилируемый пример, но, по крайней мере, вы поймете идею.

public static List<TEntity> Generic<TEntity>(this DbContext db, string name)
{
    return db.TEntity.Where(s => s.Name == name);
}

Я ткнул бы в правильном направлении, был бы оценен.

И просто для ясности, я никогда не проводил ни одного часа в классе по программированию, я самоучка, поэтому, если это невозможно, объясните ответ, пожалуйста, объясните технически, почему это невозможно в Entity Framework , Как я не мог найти ничего существенного сам.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Используйте это

public IEnumerable<TEntity> Filter(Expression<Func<TEntity, bool>> filter, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null)
            {
db.Set<TEntity>().AsNoTracking().AsQueryable().Where(filter);}
0 голосов
/ 26 августа 2018

Благодаря @Bagus Tesa я смог решить эту проблему.

Как заявляет Bagus tesa, создайте interface, который ссылается на общие свойства Entities, и ссылку interface на Entities и сделайте расширение таким образом.

Код, который я использовал,

public static IQueryable<IFilterEntity> FilterEntity(this BaseViewModel vm,
 IQueryable<IFilterEntity> list)
{
    return list.Where(s => s.Name == vm.name && 
                           s.DateMonth == vm.Month &&
                           s.DateYear == vm.Year);
}

Интерфейс,

public interface IFilterEntity
{
    string Name { get; set; } 

    int? DateYear { get; set; }

    int? DateMonth { get; set; }
}

BaseViewModel,

public class BaseViewModel
{      
    string Name => RootVm.Name;

    int? DateYear => RootVm.SelectedDate.Month;

    int? DateMonth => RootVm.SelectedDate.Month;
}

Спасибо за помощь. И я надеюсь, что это поможет кому-то еще.

...