Имеем систему классов:
class Ref<TEntity>
where TEntity : Entity
{
public long ID { get; init; }
public TEntity Data => default!;
}
abstract class Entity
{
[PrimaryKey, Identity]
public long ID { get; init; }
}
abstract class Catalog : Entity
{
[Column]
public string Name { get; init; } = default!;
}
[Table("Persons")]
class Person: Catalog
{
}
[Table("Storages")]
class Storage : Catalog
{
public Ref<Person> Manager { get; init; } = default!;
//public Person ManagerData { get; init; } = default!;
}
Ref<TEntity> — оболочка для агрегации и внешнего ключа.
Однако выдает ошибку, что не может разобрать написанное:
's.Manager.Data.Name' cannot be converted to SQL.
Вот код:
var builder = new FluentMappingBuilder(context.MappingSchema);
builder.Entity<Storage>().Property(s => s.Manager.ID).HasColumnName(nameof(Storage.Manager));
builder.Entity<Storage>().Association(s => s.Manager.Data, (s, p) => s.Manager.ID == p.ID);
builder.Build();
var query = context.GetTable<Storage>().Select(s => s.Manager.Data).Select(p => new { p.Name });
Стоит раскомментировать //public Person ManagerData { get; init; } = default!;
и всюду заменить Manager.Data на ManagerData как всё работает.
Можно в принципе использовать ассоциации, написанные "через вторую точку": s => s.Manager.Data вопрос?
Здравствуйте, Naf2000, Вы писали:
N>Можно в принципе использовать ассоциации, написанные "через вторую точку": s => s.Manager.Data вопрос?
Такой сценарий у нас точно не тестируется сейчас, поэтому, учитывая ошибку, думаю не поддерживается такое. Я добавлю issue, думаю имеет смысл пофиксить, учитывая что для колонок мы такое поддерживаем.
https://github.com/linq2db/linq2db/issues/4139