У меня есть модель данных для Entity Framework, в которой некоторые объекты имеют коллекцию атрибутов, которые можно использовать для добавления дополнительной информации. Некоторые клиенты хотели бы сопоставить эти атрибуты с «реальными» свойствами их собственной доменной модели. Пример модели данных:
public class DataEntity {
public Guid Id { get; set; }
public virtual ICollection<Attribute> Attributes { get; set; }
}
public class DataAttribute {
public Guid Id { get; set; }
public String Name { get; set; }
public String Value { get; set; }
}
public class DataStringAttribute : DataAttribute {
public String Value { get; set; }
}
public class DataInt32Attribute : DataAttribute {
public Int32 Value { get; set; }
}
И пример доменной модели:
public class DomainEntity {
public Guid Id { get; set; }
public String Name { get; set; }
public Int32 Age { get; set; }
}
Я могу довольно легко сопоставлять сущности друг с другом, но я хотел бы иметь возможность отображать выражения Linq между ними так, чтобы в клиенте это было IQueryable<DomainEntity>
, но это сопоставлено с IQueryable<DataEntity>
- для пример:
myDomainEntities.Where(o => o.Age > 21)
может быть сопоставлен с:
myDataEntities.Where(o => o.Attributes.OfType<DataInt32Attribute>()
.Any(o => o.Name = "Age" && o.Value > 21);
Каков наилучший способ сделать это - возможно, написать QueryProvider, который обходит дерево выражений и переводит его в тот, который использует модель данных - Linq-to-Linq-to-EntityFramework?
Спасибо.