【问题标题】:How to create a Generic lambda expression. Many of my entities perform the same Lambda expression predicate如何创建通用 lambda 表达式。我的许多实体都执行相同的 Lambda 表达式谓词
【发布时间】:2010-10-26 11:06:26
【问题描述】:

我使用实体框架 4。
如何执行通用 Where Lambda 子句。?

我有许多实体需要相同的 Where 查询。

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);
}

目前,我对语言 ID == 1 进行了硬编码,这将来自用户会话以使其动态化。
如果我可以在 Where 子句中直接调用 GetLmbLang(),那将非常有用。

 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 调用此存储库。那是行不通的。

【问题讨论】:

    标签: asp.net-mvc-2 entity-framework-4 lambda repository-pattern


    【解决方案1】:

    您似乎拥有三种不同的类型,它们都具有 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);
        }
        ...
    }
    

    【讨论】:

    • 我使用实体框架 4。如何使从 BaseClass 派生的 SupplierTypeText、ProductText、CategoryText 使用您的通用 GetLmbLang() 方法。
    • 这些类 SupplierTypeText,ProductText,CategoryText 不能从 BaseClass 派生,因为它们已经从 EntityObject 派生
    • 然后让他们实现一个接口。
    • 我不确定完全理解如何做到这一点。我将阅读有关界面的信息并尝试一下。我为我的所有存储库制作了接口,每个接口都用于单个类模型。 @Darin,谢谢你的帮助,我会尽快给你消息。
    • 好吧,我想通了。感谢您的帮助达林。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多