Запрос не отображенного члена класса - PullRequest
2 голосов
/ 17 марта 2011

У меня есть класс GreenGroup, который наследуется от абстрактного Group. GreenGroup имеет несопоставленное свойство State, определенное в частичном классе.

У меня есть метод GetGreenGroups(GroupFilter filter), который должен возвращать список объектов GreenGroup, где State == filter.State.

public List<GreenGroup> GetGreenGroups(GroupFilter filter)
{
    IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext);

    if(filter.OwnerId != Guid.Empty)
    {
        result = result.Where(g => g.OwnerID == filter.OwnerId);
    }

    // this is the unmapped property
    if(filter.State.IsNotNullOrEmpty())
    {
        result = result.Where(g => g.State == filter.State);
    }

    // This will throw Class Member Unmapped exception
    return new List<GreenGroup>(result);
}

Однако, поскольку State не является полем в базе данных, означает ли это, что я не могу включить его в свой запрос linq, но придется дополнительно фильтровать мой список после того, как запрос вернется?

Я просмотрел несколько сайтов, включая этот один , в котором пользователь получает такое же исключение Class Member unmapped, но поле находится в его базе данных, поэтому не похоже, что явное приведение поможет меня вышли.

Является ли мой единственный вариант разделить фильтрацию так?

public List<GreenGroup> GetGreenGroups(GroupFilter filter)
{
    IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext);

    if(filter.OwnerId != Guid.Empty)
    {
        result = result.Where(g => g.OwnerID == filter.OwnerId);
    }

    var groups = new List<GreenGroup>(result);

    if(filter.State.IsNotNullOrEmpty())
    {
        groups = (from g in groups where g.State == filter.State select g).ToList();
    }

    return groups;
}

1 Ответ

2 голосов
/ 21 марта 2011

Вы можете использовать несопоставленное поле из частичного класса в предложении select, но не в предложении where.В случае предложения select LINQ to SQL увлажняет весь объект, а затем выполняет проекцию выбора по мере необходимости.В случае других предложений (где / order by / etc) движок LINQ to SQL требует наличия столбцов в базе данных для выполнения соответствующей операции.Если вы должны использовать свойство unmapped в предложении where, вы должны принудительно перевести запрос с IQueryable на IEnumerable, прежде чем использовать свойство unmapped.К сожалению, для этого требуется, чтобы надмножество гидратировалось на стороне клиента, а остальная часть операции запроса выполнялась на стороне клиента, что, вероятно, является узким местом производительности.В вашем примере последнее предложение If будет выглядеть примерно так:

IEnumerable<GreenGroup> groups;
if(filter.State.IsNotNullOrEmpty())  
    groups = (from g in groups.ToEnumerable() where g.State == filter.State select g);    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...