2016-02-12 4 views
0

По соображениям производительности я сопоставляю набор объектов с представлением, создающим плоскую таблицу (таким образом, чтобы преобразовать наследование TPT в TPH). Это должно использоваться только для конкретного метода.EF Code Первая коллекция как ComplexType

[view] 
id 
property1 
property2 
propertyN 
complex_type_collection_property1 
complex_type_collection_property2 
complex_type_collection_propertyN 

Есть ли способ, чтобы отобразить complex_type_collection_properties к сложному собственности на материализованном объекте?

например.

[Object] 
id = [view].Id 
property1 = [view].property1 
property2 = [view].property2 
propertyN = [view].propertyN 
Collection = [{property1 = [view].complex_type_collection_property1, ...}, ...] 

Спасибо!

ответ

0

ОК Я создал example, предположим, что у вас уже есть сущность (fromDB переменная в моем коде, давайте представим, что она взята из БД) или сущности, извлеченные из БД. Чем вы можете отнести каждый объект, как показано ниже. Решение является всеобъемлющим и мало сложным. Вы также должны указать параметр типа Normalized<City>, который соответствует вашему сложному типу (если вы захотите изменить сложный тип на другой, не потребуется никаких изменений при методе кастинга). Также названия ваших сложных свойств (City1, City2 и т. Д.) Должны содержать название объекта сбора (Город), это - некоторые условные обозначения. И я создал BaseClass с общими свойствами, наши два класса вырвались из него (чтобы вы не могли копировать поля из одного класса в другой, вместо этого вы должны поместить их в BaseClass). Также вы можете иметь единственную коллекцию, т. Е. Свойство типа List<T>.

public class City 
{ 
    public string Name { get; set; } 
    public int Population { get; set; } 
} 

public class BaseClass 
{ 
    public int id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class POCO : BaseClass 
{ 
    public City City1 { get; set; } 
    public City City2 { get; set; } 
    public City City3 { get; set; } 
} 

public class Normalized<T> : BaseClass 
{ 
    public List<T> City { get; set; } 

    public static explicit operator Normalized<T>(POCO self) 
    { 
     if (self == null) 
      return null; 

     var normal = new Normalized<T>(); 

     foreach (var prop in typeof(BaseClass).GetProperties()) 
      prop.SetValue(normal, prop.GetValue(self)); 

     var complexProp = typeof(Normalized<T>).GetProperties().Where(x => x.PropertyType.GetInterfaces().Any(y => y.Name == "ICollection")).First(); 
     complexProp.SetValue(normal, new List<T>((typeof(POCO).GetProperties().Where(x => x.Name.Contains(complexProp.Name)).Select(x => (T)x.GetValue(self)).ToList()))); 

     return normal; 
    } 
} 

public static void Main(string[] args) 
{ 
    var fromDB = new POCO 
    { 
     Age = 20, 
     id = 1, 
     Name = "Mike", 
     City1 = new City { Name = "Moscow", Population = 10 }, 
     City2 = new City { Name = "London", Population = 20 }, 
     City3 = null 
    }; 
    var normal = (Normalized<City>)fromDB; 
    Console.WriteLine(normal.City.Select(x => x == null ? "EMPTY" : x.Name).Aggregate((a, b) => { return a + ", " + b; })); 
} 
+0

Спасибо за ваш ответ! Как бы вы включили Entity Framework в игру? Вы прочитали бы все POCO, а затем нормализуете его во время выполнения? – JCS

+0

Да, я предполагаю что-то вроде этого: 'var normalList = context.MyTable.Where (x => x.Age> 5) .ToList(). Выберите (x => (нормализованный ) x) .ToList();' –

+0

Также я упростил свой ответ, проверьте его. –

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