【问题标题】:Generic LINQ TO SQL Query通用 LINQ TO SQL 查询
【发布时间】:2010-01-29 04:54:24
【问题描述】:

假设我有两个由设计器生成的 L2S 类,其中一个属性如下:

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

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

我有一个通用的 DataAccess 类,如下所示:

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 类型的所有活动对象。我的猜测是我必须使用反射来做到这一点,但我对反射很陌生。谁能指出我正确的方向?

【问题讨论】:

    标签: c# .net linq-to-sql generics


    【解决方案1】:

    您需要传递给Enumerable.Where 的是Predicate&lt;T&gt;Predicate&lt;T&gt; 是一个可以吃T 实例并返回布尔值的委托;您可以将谓词视为表示truefalse 关于T 实例的属性。

    现在,有一个更大的问题是,除非您对T 施加约束,否则编译器无法知道T 有一个名为IsActive 的公共可读属性。因此,您必须定义AB 都实现(或派生自)的接口(或基类),并告诉方法GetAllActive T 实现(或派生自)此接口(或基类)。您可以通过在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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      你需要断言T实现了一个定义isActive的接口

      public interface IIsActive
      {
          bool IsActive { get; set; }
      }
      
      public class DataAccessBase<T> where T : IIsActive
      

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2015-05-22
        相关资源
        最近更新 更多