Как создать универсальное лямбда-выражение.Многие из моих сущностей выполняют один и тот же предикат лямбда-выражения - PullRequest
1 голос
/ 24 октября 2010

Я использую Entity Framework 4.Как я могу выполнить Generic Where Lambda Clause.?

У меня есть много сущностей, которым нужен один и тот же Where Query.

public Func<SupplierTypeText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}


public Func<ProductText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}


public Func<CategoryText, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}

Я бы хотел использовать универсальный метод, такой как

//public interface IRepository<T> : IRepository<T> where T : class
public Func<T, bool> GenericGetLmbLang()
{
    return (p => p.LangID == 1);
}

На данный момент я жестко закодированИдентификатор языка == 1, который будет из пользовательского сеанса, чтобы сделать его динамичным.Это было бы очень полезно, если бы я мог напрямую вызывать GetLmbLang () непосредственно в предложении Where.

 var ViewModel = _db.Suppliers.Select(model => new
            {
                model,
                SupType = _db.SupplierTypeTexts.Where(a => GenericGetLmbLang())
            });

------ ОБНОВЛЕНИЕ -------- Вот что я пытаюсь и ничего не работает.Мой базовый класс

 public class BaseGenericModel
    {
        public int LangID { get; set; }

        public Func<BaseGenericModel, bool> GetLmbLang()
        {
            return (p => p.LangID == 1);
        }

    }

Мой интерфейс -

   public interface IBaseRepository<T> where T : BaseGenericModel
   {
        Func<T, bool> GetLmbLang();
   }


   public class BaseRepository<T> : IBaseRepository<T> where T : BaseGenericModel
   {

       public Func<T, bool> GetLmbLang()
       {
          return (p => p.LangID == 1);
       }
   }

Я не могу назвать этот репозиторий из моего SupplierTypeText, ProductText, CategoryText.Это не работает

1 Ответ

2 голосов
/ 24 октября 2010

Похоже, у вас есть три разных типа со свойством LangID.Я бы сделал их производными от общего базового класса, где это свойство определено:

public class BaseClass
{
    public int LangID { get; set; }
}

, а затем использовал бы один метод:

public Func<BaseClass, bool> GetLmbLang()
{
    return (p => p.LangID == 1);
}

Можно также использовать интерфейс, содержащий это свойство.

Если вы хотите сделать его универсальным, вы можете, но вам все равно понадобится универсальное ограничение для указания общего базового типа, если вы хотите использовать свойство LangID:

public class SomeRepository<T> where T: BaseClass
{
    public Func<T, bool> GetLmbLang()
    {
        return (p => p.LangID == 1);
    }
    ...
}
...