2009-11-15 5 views
1

У меня есть мои объекты.Общий список вопросов

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 из одного типа в другой.

ответ

6

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

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 к 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 }; 

Это может потерять «сущность-Несс», однако - могут возникнуть проблемы с использованием этих объектов для обновления и т.д.

+0

он показывает мне ошибку Не удается привести объект типа «AutoSales.DataAccess.Domain .BaseTable 'для ввода «AutoSales.DataAccess.DataAccess.CarFuelType». – Parminder

+0

@parminder: Я только что отредактировал, посмотрев на него снова. –

+1

работал как шарм. большое спасибо. Вы тот, кто написал книгу C# в глубину. Thanks – Parminder

 Смежные вопросы

  • Нет связанных вопросов^_^