Создать метод в BaseRespository

Сначала я работаю с кодом подхода Entity Framework. У меня есть метод, который повторяется в нескольких моих репозиториях:

public IEnumerable SelectList(Expression> predicate)
    {
        using (PosContext Context = new PosContext())
        {
            var result = Context.Marcas
                .Where(predicate)
                .Select(x => new MarcaExtend
                {
                    MarcaExtendId = x.MarcaId,
                    Descripcion = x.Descripcion
                }).ToList();
            return result;
        }
    }

Поскольку я обычно привожу код / ​​значение, я создал класс, который обслуживает меня для всех сущностей.

public class UniversalExtend
{
    public int UniversalExtendId { get; set; }
    public string Descripcion { get; set; }
}

И я хочу сделать этот метод полезным для всех случаев, когда я восстанавливаю код значения.

public IEnumerable SelectList(Expression> predicate)
    {
        using (PosContext Context = new PosContext())
        {

            var result = Context.Set()
                .Where(predicate)
                .Select(x => new UniversalExtend
                {
                    UniversalExtendId = x.  Obtener de la entidad
                    Descripcion       = x.  Obtener de la entidad
                })
        }
    }

Проблема заключается в том, чтобы получить идентификатор каждой сущности во всех моих классах. Идентификатор - это имя класса + Id = ClassNameId => ModelId, ProviderId, ClientId и т. Д. И все они также имеют поле Описание. Можно было бы использовать отражение, чтобы получить имя сущности и добавить слово Id, пройти весь класс, чтобы найти свойство Description и поместить его туда, где оно мне нужно, возможно ли это? Есть ли другой способ сделать это? Леандро дает мне эту ошибку Error

Ничего не приносит, я показываю запрос eb the db

exec sp_executesql N'SELECT 
[Extent1].[MarcaId] AS [MarcaId], 
[Extent1].[Descripcion] AS [Descripcion]
FROM [dbo].[Marcas] AS [Extent1]
WHERE [Extent1].[Descripcion] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'W'

1
задан 04.07.2016, 22:44
2 ответа

Также как и ты определяешь один predicate ты смог бы я определил параметр source, этой формы показывать, что ты должен поля mapear

public IEnumerable<UniversalExtend> SelectList(Expression<Func<T, bool>> predicate, Expression<Func<T, UniversalExtend>> source)
{
    using (PosContext Context = new PosContext())
    {

        var result = Context.Set<T>()
            .Where(predicate)
            .Select(source).ToList();
    }
}

, и ты это использовал бы

var result = modeloRepo.SelectList(x=> x.Prop1 == valor , x => new UniversalExtend()
                                                    {
                                                        UniversalExtendId = x.ModeloId,
                                                        Descripcion = x.Descripcion
                                                    });
1
ответ дан 24.11.2019, 13:56
  • 1
    Леандро, где ты показываешь меня " это использовать и # 237; as" эта часть c и # 243; я говорю, что он идет внутри м и # 233; весь SelectList? –  Pedro Ávila 04.07.2016, 19:54
  • 2
    не внутри не, это параметр source, что присоединяется в SelectList (), ты увидишь, что это форма в, как ты призвал бы метод –  Leandro Tuttini 04.07.2016, 19:58
  • 3
    Леандро дает мне эту ошибку The operation cannot be completed because the DbContext ты существуешь been disposed. –  Pedro Ávila 04.07.2016, 22:26
  • 4
    правда не умела бы говорить тебе, потому что этот сообщения, в общем он встречается, когда у тебя есть свойство, которое загружается из-за lazy, похвалите и ты она хочешь согласиться вне using, который определяет контекст EF –  Leandro Tuttini 04.07.2016, 22:30
  • 5
    #39; listDGV = _repositoryMarca. SelectList2 (x = > x. Описание. Contains (он помечает. Описание), x = > new UniversalExtend () {UniversalExtendId = x. MarcaId, Описание = x. Описание}); и #39; Я остаюсь экспертом и # 237; я функционирую превосходно –  Pedro Ávila 04.07.2016, 23:13

Одна opciГіn состоит в том, чтобы создавать интерфейс, давайте помещать его имени IUniversalExtendable со свойствами, которые ты хочешь вернуть организации, например:

public interface IUniversalExtendable
{
    int UniversalExtendId { get; }
    string Descripcion { get; } 
}

потом конкретные организации podrГ-an помогать - интерфейс:

Например:

public class Modelo : IUniversalExtendable
{
    public int ModeloId { get; set; }
    public string Descripcion { get; set; }

    // Agregamos esta propiedad para cumpir con la interfaz
    public int UniversalExtendId => ModeloId; // C# 6
    //public int UniversalExtendId { get { return ModeloId: } } // C# 5

    ...
}

И потом просто уже podrГ-схвати использовать constrain: where T : IUniversalExtendable, чтобы не использовать reflection

public IEnumerable<UniversalExtend> SelectList<T>(Expression<Func<T, bool>> predicate)
    where T : IUniversalExtendable
{
    using (PosContext Context = new PosContext())
    {
        var result = Context.Set<T>()
            .Where(predicate)
            .Select(x => new UniversalExtend
            {
                // Como T es IUniversalExtendable posee estas dos propiedades
                UniversalExtendId = x.UniversalExtendId,
                Descripcion       = x.Descripcion
            })

        ...
    }
}
1
ответ дан 24.11.2019, 13:56
  • 1
    Привет Карлос, спасибо за ответ, Я Моделирую, получив в наследство UniversalExtendable осуществляются два свойства, которые у него есть, но у всех моих классов уже есть свойство Desripcion –  Pedro Ávila 04.07.2016, 20:05
  • 2
    В любом случае ты должен размещать это в интерфейсе, по-другому не podr и # 225; s соглашаться на нее во время делания select, так как, разместив constrain, ты граничишь, в который T осуществил интерфейс, и если Descipcion не часть интерфейса тогда Descripcion = x.Descipcion быть и # 225; ошибка синтаксиса, так как x, что типа IUniversalExtendable, не содержит никакого свойства llamadad Descripcion –  Carlos Muñoz 04.07.2016, 20:11
  • 3
    Уважаемый Карлос, очень хорошая твой ответ благодаря тебе я вижу, что есть несколько способов делать то, что quer и # 237; чтобы получать, порань, что не могут быть помечены два ответов. –  Pedro Ávila 04.07.2016, 23:16