общий список вопросов - PullRequest
       22

общий список вопросов

1 голос
/ 15 ноября 2009

У меня есть такие предметы.

public class BaseTable
{
    public int ID               { get; set; }
    public int ParentID         { get; set; }
    public string Description   { get; set; }
    public bool IsActive        { get; set; }    

}

public class CarFuelType : BaseTable
{

}

и тестовый класс

public class Test
{
    public IList<CarFuelType> GetAllActiveFuelTypes()
    {
        var result = GetAllActiveData<CarFuelType>(LookUpTableConstants.CarFuelType);

        return result.Cast<CarFuelType>().ToList(); 
    }


    private IList<T> GetAllActiveData<T>(int filter)
    {
        var result = from c in _lookUpTableValuesRepository.GetAllRowsWhere(l => l.ParentID == filter && l.IsActive==true)
                     select new BaseTable{ ID = c.ID, Description = c.Description, ParentID = c.ParentID };
        return result.ToList() as IList<T>;
    }

}

но я получаю нулевой результат, возвращенный методом GetAllActiveData. Есть ли в любом случае я конвертировать IList из одного типа в другой.

1 Ответ

6 голосов
/ 15 ноября 2009

У вас проблема здесь, потому что вы на самом деле не создаете экземпляры производного класса. Вам нужно создать экземпляры CarFuelType, а не BaseTable. Как только вы это сделаете, вам не понадобится кастинг. Вы можете сделать это следующим образом - по крайней мере для LINQ to Objects:

private IList<T> GetAllActiveData<T>(int filter) where T : BaseTable, new()
{
    var result = from c in _lookUpTableValuesRepository
                               .GetAllRowsWhere(l => l.ParentID == filter 
                                                && l.IsActive==true)
                 select new T() { ID = c.ID, 
                                  Description = c.Description,
                                  ParentID = c.ParentID };
    return result.ToList();
}

Я сомневаюсь, что это будет работать для LINQ to SQL или Entity Framework, хотя ... вам, вероятно, придется создать экземпляры BaseTable в запросе LINQ to SQL, а затем преобразовать их в памяти, например,

    var baseQuery = from c in _lookUpTableValuesRepository
                               .GetAllRowsWhere(l => l.ParentID == filter 
                                                && l.IsActive==true)
                 select new BaseTable { ID = c.ID, 
                                        Description = c.Description,
                                        ParentID = c.ParentID };

    var converted = baseQuery.AsEnumerable()
                             .Select(b => new T() { ID = b.ID, 
                                                    Description = b.Description,
                                                    ParentID = b.ParentID };

Однако это может утратить "сущность" - у вас могут быть проблемы с использованием этих объектов для обновлений и т. Д.

...