複数でのLINQクエリは、/ RavenDBのためにどれが含まれています
質問
私は、「タグ」のリストが含まれているドキュメントクラスを持っています。ような何かます:
class Item {
string Name { get; set; }
List<string> Tags {get; set;}
}
今、私が手に私のすべての項目は、タグのリストによってフィルタリングすることをRavenDBのためのクエリを作成したいと思います。 Entity Frameworkのを使用している場合、私はこのようなもので、これを行うために管理します:
var query = GetQueryable();
foreach (var tag in tags)
{
query = query.Where(i => i.Tags.Contains(tag));
}
しかし、これはRavenDBで動作するようには思えない、最も可能性の高いサポートされていない含まれているので..私はまた、任意の使用してそれを書き換えてみた(Where(i => i.Tags.Any(t=>t == tag))
)それは私に奇妙な例外を与えます:
Unable to cast object of type
'System.Linq.Expressions.PrimitiveParameterExpression`1[System.String]'
to type 'System.Linq.Expressions.MemberExpression
すべての偉大なアイデア?アム私にこれをやって、完全に間違っている?
解決
入っては確かにまだ(おそらくそれがあるべき、それは全く別の問題だ - それがために尋ねられたとき私たちは本当にさまざまな演算子のサポートを追加します)はサポートされていません。
どれに対して複数のクエリについては、私はあなたが動的データをやろうとしていると仮定して、あなたは、
のような何かを達成したいです"X OR Y OR Z"
これはトリッキー一つだ、とデフォルトでLINQプロバイダは、句とそれらの複数を集約し、
のようなあなたの例のルックスそうになります"X AND Y AND Z"
明らかにケースになることはありません。
この1のためのあなたの最良のオプションは、(少なくとも今のところ)Luceneクエリに落下し、このような何かを行うことです。
var results = s.Advanced.LuceneQuery<Item>()
.Where(string.Format("Tags,:({0})", string.Join(" OR ", tags)));
メイクセンス?
上記のクエリは、
のようになります。"Tags,:(X OR Y OR Z)"
注: "タグ、" タグ配列の
であることを通知RavenDBさて、[編集]!
あなたが実際にのの欲しいものを得るための最も簡単な方法は、これらの線に沿って何か
を行うことです new IndexDefinition<Item, Item>()
{
Map = docs => from doc in docs
select new
{
Tags = doc.Tags
},
Indexes = {{ x => x.Tags, FieldIndexing.Analyzed }}
}.ToIndexDefinition(store.Conventions));
次に、あなたの論理積のクエリに、あなたはこのような何かを行うことができます:
var results = s.Advanced.LuceneQuery<Item, WhateverYouCalledThatIndex>()
.Where(string.Format("Tags:({0})", string.Join(" AND ", tags)));
さて、物事が知っておくために、
Tags = doc.Tags
これは、この例のために動作します文字列だけだとして、1つの巨大なブロブにその配列全体をシリアル化されます。
私はこれを表現する良い方法で探しています、それは本当に非常によく全体でマッピングされていないとして、我々は、これを行うためのLINQっぽい方法を考え出すだろうことはほとんどありません - しかし、それのありますの動作します答え:)
私は、少なくとも行う。
にできるようにするにはかなりのように思います Map = docs => from doc in docs
select new
{
Tags = String.Join(" ", doc.Tags)
},
(これはので、それを試していない動作しません)、それはあなたが達成したいかについて、もう少し明示されています。