2009-03-28 2 views
2

Я пытаюсь реорганизовать некоторый код платформы Entity Framework, где у меня есть объект Product и связанные с ним объекты для серии продуктов, семейства, бренда и т. Д. У семейств серий, семейства и бренда есть одна и та же базовая структура с идентификатором и текстом имущество.Как я могу реорганизовать эти 2 метода в 1?

Эти два метода, приведенные ниже, очень похожи и должны быть реорганизованы в один метод, но я не уверен, как динамически передавать, в какой сущности я запрашиваю. В этом случае мне нужно пройти в db.ProductFamilies или db.ProductSeriesSet. Любые идеи, как сделать эти 2, становятся 1?

Спасибо!

public DTOs.ProductCollection GetFamily(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var fam = (from collection in db.ProductFamilies.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(fam, true); 
     } 
    } 

    public DTOs.ProductCollection GetSeries(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var ser = (from collection in db.ProductSeriesSet.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(ser, true); 
     } 
    } 

ответ

2

Если db.ProductFamilies и db.ProductSeriesSet наследуются от базового класса, то при использовании ProductCollectionEFToProductCollectionDTO (BaseClass OBJ, BOOL значение);

Или подумайте о Общий тип.

Это два основных подхода.

+0

Как обрабатывать разницу, замеченную в предложении from, где вы запрашиваете из ProductSeriesSet или ProductFamilies? –

+0

Я этого не замечал, да, ваш лучше, чем мой. –

5

Вы можете использовать Func<T, TResult> делегировать выбор хорошей коллекции объекта к абоненту:

public DTOs.ProductCollection Get(int id, Func<Entities, XXX> selector) 
{ 
    using (Entities db = new Entities()) 
    { 
     var result = (from collection in selector(db).Include("Product") 
        .Include("Product.Stuff1") 
        .Include("Product.Stuff2") 
        where collection.Id == id 
        select collection).FirstOrDefault(); 
     return ProductCollectionEFToProductCollectionDTO(result, true); 
    } 
} 

Здесь XXX имеет тип db.ProductFamilies и db.ProductSeriesSet.

Вы можете назвать это так:

Get(42, db => db.ProductFamilies); 
Get(12, db => db.ProductSeriesSet); 

ли работа?

+0

Практически там. Проблема, с которой я сталкиваюсь, заключается в том, что ProductFamilies и ProductSeriesSet (XXX) не имеют общего базового класса, поэтому у меня нет типа для замены XXX. То, что я пытался сделать, это добавить интерфейс ProductCollection, который они оба реализуют. Продолжение в следующем комментарии ... – EricAppel

+0

Имея общий интерфейс, я мог реализовать этот метод, но при вызове необходимо было выполнить следующее: GetProductCollection (id, db => (ObjectQuery ) db.ProductFamilies.Cast ()); Продолжение ... – EricAppel

+0

Из-за того, что я получаю «LINQ to Entities поддерживает только примитивные типы данных Entity Data Model» во время выполнения. Я не вижу, как я могу получить общий базовый тип для работы со всеми этими объектами. Каждый объект извлекает свои общие поля из другой таблицы. Как я могу в общих чертах работать с сущностями? – EricAppel

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