Ошибка перевода запроса EF при использовании конструктора, но не при использовании инициализации свойстваC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка перевода запроса EF при использовании конструктора, но не при использовании инициализации свойства

Сообщение Anonymous »

При выполнении несколько запутанного запроса я получаю исключение «невозможно перевести», если выбираю класс, использующий конструктор. Как ни странно, я добиваюсь успеха, если вместо этого использую тот же класс, но с инициализацией свойств. Я не могу понять, почему EF может перевести одно, но не другое. В чем причина этого?

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

var singleEnvData = GetData().SingleOrDefault(d => d.EnvId == id);
Неверная версия

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

IQueryable GetData()
{
return EnvironmentTags
.Where(et => !et.IsDeleted &&
et.PerforceServers.Any(ps => !ps.IsDeleted &&
!ps.PerforceServer.IsDeleted &&
ps.PerforceServer.Status != ServerStatus.Decommissioned) &&
et.PerforceServers.Count(ps => ps.PerforceServer.ServerType == ServerType.Commit) >= 1)
.Select(et => new
{
et.Id,
et.Name,
Users = et.PerforceServers.SelectMany(ps =>
ps.PerforceServer.Users.Where(u => u.IsDeleted == false && u.DeletedOnPerforceServer == false))
})
.Select(et => new Foo
(
et.Id,
et.Name,
et.Users.Count(),
et.Users.Count(u => u.IsSuperUser != null && u.IsSuperUser.Value),
et.Users.Count(u =>
u.TicketExpiresOn != null && u.TicketExpiresOn.Value > DateTime.UtcNow.AddYears(1)),
et.Users.Count(u =>
u.LastAccessedOn == null || u.LastAccessedOn < DateTime.UtcNow.AddMonths(-3)),
et.Users.Count(u => u.IsDisabledInAd != null && u.IsDisabledInAd.Value),
et.Users.Count(u => u.PerforceGroups.Any())
));
}
Успешная версия

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

IQueryable GetData()
{
return EnvironmentTags
.Where(et => !et.IsDeleted &&
et.PerforceServers.Any(ps => !ps.IsDeleted &&
!ps.PerforceServer.IsDeleted &&
ps.PerforceServer.Status != ServerStatus.Decommissioned) &&
et.PerforceServers.Count(ps => ps.PerforceServer.ServerType == ServerType.Commit) >= 1)
.Select(et => new
{
et.Id,
et.Name,
Users = et.PerforceServers.SelectMany(ps =>
ps.PerforceServer.Users.Where(u => u.IsDeleted == false && u.DeletedOnPerforceServer == false))
})
.Select(et => new Foo
{
EnvId = et.Id,
EnvName = et.Name,
Total = et.Users.Count(),
Supers = et.Users.Count(u => u.IsSuperUser != null && u.IsSuperUser.Value),
UnlimitedTickets = et.Users.Count(u =>
u.TicketExpiresOn != null && u.TicketExpiresOn.Value > DateTime.UtcNow.AddYears(1)),
Inactive = et.Users.Count(u =>
u.LastAccessedOn == null || u.LastAccessedOn < DateTime.UtcNow.AddMonths(-3)),
DisabledInAd = et.Users.Count(u => u.IsDisabledInAd != null && u.IsDisabledInAd.Value),
NoGroupMembership = et.Users.Count(u => u.PerforceGroups.Any())
});
}

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

class Foo
{
public int EnvId { get; set; }
public string EnvName { get; set; }
public int Total { get; set; }
public int Supers { get; set; }
public int UnlimitedTickets { get; set; }
public int Inactive { get; set; }
public int DisabledInAd { get; set; }
public int NoGroupMembership { get; set; }

public Foo(
int envId,
string envName,
int total,
int supers,
int unlimitedTickets,
int inactive,
int disabledInAd,
int noGroupMembership)
{
EnvId = envId;
EnvName = envName;
Total = total;
Supers = supers;
UnlimitedTickets = unlimitedTickets;
Inactive = inactive;
DisabledInAd = disabledInAd;
NoGroupMembership = noGroupMembership;
}

public Foo()
{

}
}
Ошибка (происходит в var singleEnvData = GetData().SingleOrDefault(d => d.EnvId == id);)

InvalidOperationException: выражение LINQ «DbSet()
//опущено для краткости
).EnvId == __id_0)» не удалось перевести. Либо перепишите запрос в форме, которая >может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов >'AsEnumerable', 'AsAsyncEnumerable', 'ToList' или 'ToListAsync'.


Подробнее здесь: https://stackoverflow.com/questions/786 ... perty-init
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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