2017-01-12 1 views
1

Я хочу, чтобы создать коллекцию царства в список, а затем проецировать его. Однако это немедленно вызывает ошибку. Ошибка, которую я получаю, похожа на проблему this, а также this, но, похоже, происходит по другой (неизвестной) причине, так как кажется, что ответы по этим двум вопросам не относятся к моему состоянию (я использую более новую версию Realm, и я не использую вызов доступа к свойствам в предикате лямбда).Царство в форматах Xamarin: Еще один «rhs двоичного оператора« Equal »должен быть константным или замыкающим выражением« issue

Я использую свою коллекцию царства для создания другого типа. Я знаю, что текущая версия Realm (0.81.0) не поддерживает .Select(), поэтому я звоню .ToList() и затем проецирует. Трассировка стека показывает, что источником исключения является вызов .ToList().

Мой код:

private void BuildAndApplyBindingContext(int listId) 
{ 
    realm.All<MemberInventoryItem>() 
     .Where(i => i.InventoryListId == listId) 
     .ToList() 
     .Select(i => new ItemListEntryViewModel { 
      Id = i.InventoryItemId, 
      Type = i.IsAcquired ? InventoryType.Item : InventoryType.UnacquiredListItem, 
      Name = i.Item, 
      IsAcquired = i.IsAcquired, 
      SubText = UiHelper.GetLocationString(i), 
      BadgeText = UiHelper.GetBadgeText(i), 
      ImageRef = UiHelper.SetMissingImage(i.ImageUrl), 
      ExpiresDate = i.ExpiresDate, 
      ShowNoticeText = i.ExpiresDate < DateTime.Now 
      }).OrderBy(i => i.Name) 
     .ToList() 
    }; 

    ... 
} 

Я получаю следующее сообщение об ошибке:

System.NotSupportedException: The rhs of the binary operator 'Equal' should be a constant or closure variable expression. 
Unable to process `Convert(value(Prepify.App.Pages.Inventory.ListDetail.DetailTab+<>c__DisplayClass7_0).listId)` 

Что-то отметить, и я понятия не имею, если это имеет значение или нет, но свойство InventoryListId в моей статье .Where() имеет тип int?. Должен ли это?

Использование Realm Xamarin v0.81.0 на формах/Android

ответ

2

Something to note, and I have no idea if it matters or not, but the property InventoryListId in my .Where() clause is of type int? . Should this matter?

Хорошо, что вы думали включить, что в вашем вопросе. Было бы разумно, что это имеет значение. Это означает, что ваш

.Where(i => i.InventoryListId == listId) 

фактически

.Where(i => i.InventoryListId == (int?)listId) 

и это преобразование в полученном дереве выражения. Вот почему вы видите Convert(...) в сообщении об исключении.

Сообщение об исключении поставщика LINQ говорит, что для него требуется либо выражение константы, либо ограничение замыкания, а преобразованное выражение переменной закрытия не является ни одним из них.

И этого можно избежать так же, как в вопросе, на который вы ссылаетесь: явно сохраните его в локальной переменной.

private void BuildAndApplyBindingContext(int listId) 
{ 
    int? listIdNullable = listId; 
    realm.All<MemberInventoryItem>() 
     .Where(i => i.InventoryListId == listIdNullable) 
     ... 
+0

Сейчас я расскажу об этом позже. Благодарю. – Britton

+0

спасибо, отлично сработало – Britton

+0

почему нет любви к моему вопросу? :) – Britton