在对象实现接口上进行LINQ查询

时间:2011-01-20 06:40:33

标签: c# .net linq generics

请参阅下面的代码。我想检查一些属性(例如在IsActive上)。你能告诉我在我的情况下如何在GetList()中实现这个怎么做?

谢谢,

   public interface ILookup
    {
        int Id { get; set; }
        string FR { get; set; }
        string NL { get; set; }
        string EN { get; set; }
        bool IsActive { get; set; }
    }

    public class LookupA : ILookup
    {

    }
    public class LookupB : ILookup
    {

    }

    public interface ILookupRepository<T>
    {
        IList<T> GetList();
    }


    public class LookupRepository<T> : ILookupRepository<T>
    {
        public IList<T> GetList()
        {
            List<T> list = Session.Query<T>().ToList<T>();
            return list;
        }       
    }

2 个答案:

答案 0 :(得分:3)

如果您知道T类型为ILookup,则需要对其进行约束:

public interface ILookup
{
    int Id { get; set; }
    string FR { get; set; }
    string NL { get; set; }
    string EN { get; set; }
    bool IsActive { get; set; }
}

public class LookupA : ILookup
{

}
public class LookupB : ILookup
{

}

public interface ILookupRepository<T>
{
    IList<T> GetList();
}


public class LookupRepository<T> : ILookupRepository<T> where T : ILookup
{
    public IList<T> GetList()
    {
        List<T> list = Session.Query<T>().Where(y => y.IsActive).ToList<T>();
        return list;
    }       
}

答案 1 :(得分:0)

您应该可以利用Generic Constraints来帮助您。

首先,更改您的界面定义:

public interface ILookupRepository<T> where T : ILookup
//                                    ^^^^^^^^^^^^^^^^^

其次,更改类定义以匹配约束:

public class LookupRepository<T> : ILookupRepository<T> where T : ILookup
//                                                      ^^^^^^^^^^^^^^^^^

约束将要求泛型类型参数实现ILookup。这将允许您使用GetList方法中的界面成员。