Базовая условная проекция C# Entity FrameworkC#

Место общения программистов C#
Ответить
Anonymous
 Базовая условная проекция C# Entity Framework

Сообщение Anonymous »

Сейчас я использую Entity Framework Core, и он работает очень хорошо. Однако одна вещь, которую я пытаюсь оптимизировать в своем приложении, — это возврат вычисленных данных из базы данных во время запроса. Сначала я использую код, в котором каждая модель напрямую сопоставляется с одной таблицей.

Вот упрощенный пример моих моделей персистентности:

Код: Выделить всё

public class User
{
public int Id { get; set; }

public string Name { get; set; }

public ICollection Roles { get; set; }
}

public class UserRole
{
public int Id { get; set; }

public int UserId { get; set; }

public User User { get; set; }

public string Role { get; set; }
}
< /code>

То, что я в настоящее время использую, является изменением шаблона спецификации, которая позволяет мне запустить переменную сумму .include /.theninclude < /code> в запросе перед выполнением. Полем Однако то, что я хочу иметь в состоянии сделать, это условное включение определенных частей проекции.

public class UserImpl
{
public User User { get; set; }

public int? RoleCount { get; set; }

public static Expression Projection(UserImplParams opts) {
return u => new UserImpl
{
User = u,
RoleCount = opts != null && opts.IncludeRoleCount ? u.Roles.Count() : default(int?)
};
}
}

public class UserImplParams
{
public bool IncludeRoleCount { get; set; }
}
< /code>

И то, чего я хотел бы достичь, - это способ сделать что -то похожее на это: < /p>

var opts= new UserImplParams
{
IncludeUserRole = true
};

await _databaseContext.Users.Select(UserImpl.Projection(opts)).ToListAsync();
< /code>

Мне бы хотелось, чтобы EF Core либо видит: < /p>

u => new UserImpl
{
User = u,
RoleCount = u.Roles.Count()
};
ИЛИ

u => new UserImpl
{
User = u,
RoleCount = default(int?)
};
< /code>

Это возможно? Это в основном потому, что это выражение может содержать несколько проекционных свойств и даже вложенных. Ужигание всего этого в базу данных каждый раз только для нескольких данных кажется неэффективным.


Подробнее здесь: https://stackoverflow.com/questions/577 ... projection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»