Расширить Expression другим выражением - PullRequest
0 голосов
/ 16 июня 2020

мы сопоставляем Entity Framework Entities с объектами домена с Expressions при получении данных из базы данных. Поэтому мы часто получаем что-то вроде этого:

public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, ... }; // Foo mapping

Но иногда , нам нужно сопоставить другой объект домена в объекте домена Foo, например:

public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, Foo2 = MapFoo2ToDomain.Invoke(db.FOO2), ... }; // Foo mapping with Foo2 mapping

public static Expression<Func<FOO, Foo>> MapFoo2ToDomain = (db) =>
{ Id = db.ID, ... }; // Foo2 mapping

Но если нам не нужно это отображение, мы не хотим отображать его по причинам производительности. Итак, в настоящее время у нас есть два сопоставления для Foo: одно с отображением Foo2, другое без. Это заканчивается следующим образом:

public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
{ Id = db.ID, ... }; // Foo mapping

public static Expression<Func<FOO, Foo>> MapFooWithFoo2ToDomain = (db) =>
{ Id = db.ID, Foo2 = MapFoo2ToDomain.Invoke(db.FOO2) }; // Foo mapping with Foo2 mapping

Итак, мы заканчиваем дублированием кода (отображением Foo). Это то, что мне очень не нравится, потому что мы должны «поддерживать» два сопоставления вместо одного. Итак, я хочу иметь «базовое сопоставление», которое используют все другие сопоставления, которое затем расширяется специальным сопоставлением. Примерно так:

public static Expression<Func<FOO, Foo>> MapFooToDomainBase = (db) =>
{ Id = db.ID }; // Foo base mapping

public static Expression<Func<FOO, Foo>> MapFooToDomain = (db) =>
MapFooToDomainBase.Invoke(db); // Foo mapping which only uses base mapping

public static Expression<Func<FOO, Foo>> MapFooWithFoo2ToDomain = (db) =>
MapFooToDomainBase.Invoke(db) { Foo2 = MapFoo2ToDomain.Invoke(db.FOO2) }; // Foo with Foo2 mapping which uses Foo base mapping and extends this with Foo2 mapping

Такое возможно? Если да, то как мне этого добиться?

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...