sujan_maharjan Ответов: 1

Добавить выражение в базу репозитория на языке Си#


Всем привет
Я использую asp.net 4.5 с кодом, сначала использующим шаблон репозитория в c#.

базовый класс :

public interface IAuditableEntity
        {
            ...
            string DeletedBy { get; set; }
            DateTime? DeletedDate { get; set; }
            bool IsDeleted { get; set; }
        }
    public abstract class AuditableEntity:  IAuditableEntity
            {
                ...
                public string DeletedBy { get; set; }
                public DateTime? DeletedDate { get; set; }
                public bool IsDeleted { get;set; }
            }


класс:
public class Group : AuditableEntity
        {
            public int Id {get;set;}
            public string Code { get; set; }
            public string Name { get; set; }
            public GroupType Type { get; set; }
            public string Description { get; set; }
            public int? ParentId { get; set; }
    
        }


Хранилище Базы :

public class RepositoryBase<T> : IRepository<T> where T : class
        {
            protected DbContext _entities;
            protected DbSet<T> dbSet;
            #endregion
            public RepositoryBase(DbContext context)
            {
                _entities = context;
                dbSet = context.Set<T>();
            }
            ...
            public virtual IQueryable<T> GetAll()
            {
                try
                {
                   
                    return dbSet;
                      
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            public virtual IQueryable<T> GetMany(Expression<Func<T, bool>> where)
            {
                return dbSet.Where(where);
            }
           ...
    
    
        }


мой вопрос:
я хочу, чтобы добавить выражение в `способность` и `функция гетманы` если IAuditableEntry Repositorybase Т использовать ``

Что я уже пробовал:

public virtual IQueryable<T> GetAll()
                {
                    try
                    {
                       
                        return dbSet.Where(x=> x is IAuditableEntity && !((IAuditableEntity)x).IsDeleted);
                          
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }


Когда я использовал это
верните dbSet.Где(Х=> У Х IAuditableEntity &&усилителя; !((IAuditableEntity)x).IsDeleted);

он показывает ошибку, как :

The 'TypeIs' expression with an input of type
'Group' and a check of type
'Base.IAuditableEntity' is not supported. Only entity
 types and complex types are supported in LINQ to Entities queries.

Richard Deeming

catch (Exception ex)
{
    throw ex;
}

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

Если ты действительно хотите повторно выбросить исключение, просто используйте throw; вместо throw ex;:
catch (Exception)
{
    throw;
}


Но в этом случае, поскольку вы не делаете ничего, кроме переосмысления исключения, нет никакого смысла ловить его в первую очередь. Просто уберите его try..catch заблокируйте, и пусть исключение распространяется нормально.

Richard Deeming

Если вы используете ядро Entity Framework, вам может потребоваться настроить глобальный фильтр для скрытия мягко удаленных сущностей:
Глобальные фильтры запросов - EF Core | Microsoft Docs[^]

1 Ответов

Рейтинг:
0

phil.o

Вы можете проверить для T вместо:

public virtual IQueryable<T> GetAll()
{
   try
   {
      return (T is IAuditableEntity)
         ? dbSet.Where(x => !((IAuditableEntity)x).IsDeleted)
         : dbSet.All();
   }
   catch (Exception ex)
   {
      // Here you should do something with the exception (log it for example, or display its details).
      // If you rethrow it, it will be as if you never caught it in the first place.
   }
}


Maciej Los

5ed!
Кстати: не забудьте добавить x=> в Where заявление.

phil.o

Исправленный. Спасибо Мацей :)