2010-01-28 114 views
0

可以说我有由设计师与一个属性生成了两个L2S类如下:通用LINQ to SQL查询

public class A 
{ 
    public bool IsActive {get;set;} 
} 

public class B 
{ 
    public bool IsActive {get;set;} 
} 

我有一个通用的数据访问类,如下所示:

public class DataAccessBase<T> where T : class 
    { 
     NWDataContext dataContext = new NWDataContext(); 

     public IList<T> GetAllActive() 
     { 
      return dataContext.GetTable<T>() 
        .where(T.IsActive == true) -----> How can i do something like this? 
        .ToList<T>(); 
     } 
    } 

现在从GetAllActive()如何返回A或B类型的所有活动对象。我的猜测是,我必须使用反射来做到这一点,但我对反射非常陌生。任何人都可以将我指向正确的方向吗?

回答

4

你需要传递给Enumerable.Where的是Predicate<T>。 A Predicate<T>是一个代表,可以吃T的实例并返回一个bool;您可以将谓词想象为表示属性truefalse关于T的位置的属性。

现在,有一个更大的问题是,除非您对T施加约束,否则编译器无法知道T具有名为IsActive的公共可读属性。因此,您必须定义一个接口(或基类),该接口(或基类)既可以实现A,也可以从B实现(或从中派生),并告诉方法GetAllActiveT实现(或派生自)此接口(或基类)。您可以通过在DataAccessBase的定义中约束T来完成此操作。因此:

interface IIsActive { 
    bool IsActive { get; set; } 
} 

class A : IIsActive { 
    public bool IsActive { get; set; } 
} 
class B : IIsActive { 
    public bool IsActive { get; set; } 
} 

public class DataAccessBase<T> where T : class, IIsActive { 
    public IList<T> GetAllActive() { 
    return dataContext.GetTable<T>() 
         .Where(x => x.IsActive) 
         .ToList(); 
    } 
} 
+0

感谢的接口。它工作完美。 – Kumar 2010-01-28 20:56:12

1

您需要断言T实现定义isActive

public interface IIsActive 
{ 
    bool IsActive { get; set; } 
} 

public class DataAccessBase<T> where T : IIsActive