سؤال

ولدي الأشياء بلدي من هذا القبيل.

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 من نوع واحد إلى آخر.

هل كانت مفيدة؟

المحلول

ولقد حصلت مشكلة هنا، لأنك لا يخلق في الواقع أي حالات من فئة مشتقة. تحتاج إلى إنشاء فعلا حالات 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 أو إطار الكيان على الرغم من ... كنت ربما تضطر إلى إنشاء مثيلات BaseTable في LINQ إلى 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 };

وهذا قد يفقد "الكيان نيس" ولكن - قد يكون لديك مشاكل في استخدام هذه الكائنات للحصول على التحديثات وغيرها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top