Общий LINQ TO SQL Query - PullRequest
       11

Общий LINQ TO SQL Query

0 голосов
/ 28 января 2010

Допустим, у меня есть два класса 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. Я предполагаю, что я должен использовать рефлексию, чтобы сделать это, но я очень плохо знаком с рефлексией. Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

4 голосов
/ 28 января 2010

То, что вам нужно передать Enumerable.Where, это Predicate<T>. Predicate<T> - это делегат, который может принимать экземпляры T и возвращать bool; вы можете думать о предикате как о представлении свойства, которое является либо true, либо false относительно значений T.

Теперь есть большая проблема, заключающаяся в том, что если вы не наложите ограничение на T, компилятор не сможет узнать, что T имеет общедоступное свойство с именем IsActive. Таким образом, вы должны определить интерфейс (или базовый класс), который A и B реализуют (или наследовать) от него, и сообщить методу GetAllActive, что T реализует (или наследует) этот интерфейс (или базовый класс). Вы можете сделать это, ограничив T в определении DataAccessBase. Таким образом:

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();
    }
}
1 голос
/ 28 января 2010

Вы должны утверждать, что T реализует интерфейс, который определяет isActive

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

public class DataAccessBase<T> where T : IIsActive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...