1

我使用实体框架4.
如何执行泛型Where Lambda子句。
如何创建通用lambda表达式。我的许多实体执行相同的Lambda表达式谓词

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

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

------ UPDATE --------
下面是我尝试一切都停止工作。

我的基类

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。这是行不通的。

回答

2

看来你有三种不同的类型都具有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); 
    } 
    ... 
} 
+0

我使用实体框架4.如何能我从BaseClass派生的SupplierTypeText,ProductText,CategoryText使用您的Generic GetLmbLang()方法。 – 2010-10-25 00:39:11

+0

这些类SupplierTypeText,ProductText,CategoryText无法从BaseClass派生,因为它们已经从EntityObject派生出来 – 2010-10-25 02:51:55

+0

然后让它们实现一个接口。 – 2010-10-25 06:05:06