Xamarin形式的领域:二元运算符的另一个" rhs' Equal'应该是一个常量或闭包变量表达式"问题

时间:2017-01-12 06:55:39

标签: c# .net linq realm

我想将一个领域集合转换为一个列表,然后进行投影。但是,这样做会立即触发错误。我收到的错误类似于this问题,也是this,但似乎是因为其他(未知)原因而发生,因为看起来这两个问题中的答案都没有&# 39; t适用于我的条件(我使用较新版本的Realm并且我没有在谓词lambda中使用属性访问器调用)。

我使用我的领域集合投影到另一种类型。我知道当前版本的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?类型。这有关系吗?

在Forms / Android上使用Realm Xamarin v0.81.0

1 个答案:

答案 0 :(得分:4)

  

需要注意的事项,我不知道它是否重要,但我InventoryListId子句中的属性.Where()属于int?类型。这有关系吗?

很好,您认为在您的问题中包含这一点。重要的是它是有意义的。这意味着你的

.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)
        ...