2017-01-12 19 views
1

レルムコレクションをリストにキャストし、それを投影したいとします。ただし、これを行うとすぐにエラーが発生します。私が受け取っているエラーはthisの問題に似ていますが、またthisですが、この2つの質問の回答が私の条件に当てはまらないので、別の(未知の)理由で起きているようです新しいバージョンのRealmと私は述語ラムダでプロパティアクセサコールを使用していません)。Xamarinフォームのレルム:別の "2項演算子のrhs"等しい "は定数またはクロージャ変数式でなければなりません"問題

私のレルムコレクションを使用して別のタイプに投影しています。レルム(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)` 

は何かを、それが重要かどうかはわかりませんが、私の.Where()句のプロパティInventoryListIdタイプはint?です。これは問題でしょうか?フォーム上のレルム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

関連する問題