我想将一个领域集合转换为一个列表,然后进行投影。但是,这样做会立即触发错误。我收到的错误类似于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
答案 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)
...