1

RavenDB データベース全体を照会できる 1 つのメソッドが必要です。

私のメソッド署名は次のようになります。

public static DataTable GetData(string className, int amount, string orderByProperty, string filterByProperty, string filterByOperator, string filterCompare)

上記のすべてを動的な LuceneQuery で達成できると考えました。

session.Advanced.LuceneQuery<dynamic>();

問題は: 指定された型で使用しているため、クエリにclassNamedynamicに一致する型のみが含まれていることを確認するにはどうすればよいですか?

.WhereType(className)またはのようなものを探してい.Where("type: " + className)ます。

解決

これは、正しいタイプの結果を返します。

var type = Type.GetType("Business.Data.DTO." + className);

var tagName = RavenDb.GetTypeTagName(type);
using (var session = RavenDb.OpenSession())
{
    var result = session.Advanced
                        .LuceneQuery<object, RavenDocumentsByEntityName>()
                        .WhereEquals("Tag", tagName)
                        .ToList();
}

これに「WhereEquals」やその他のフィルターを追加することはできないことに注意してください。これは、「RavenDocumentByEntityName」インデックスにそのドキュメント タイプに固有のものが含まれていないためです。

つまり、このソリューションは、私が達成したいことには使用できません。

私がやったこと

私の要件を完全に満たすわけではありませんが、これは私がやったことです:

public static List<T> GetData<T>(DataQuery query)
{
    using (var session = RavenDb.OpenSession())
    {
        var result = session.Advanced.LuceneQuery<T>();

        if (!string.IsNullOrEmpty(query.FilterByProperty))
        {
            if (query.FilterByOperator == "=")
            {
                result = result.WhereEquals(query.FilterByProperty, query.FilterCompare);
            }
            else if (query.FilterByOperator == "StartsWith")
            {
                result = result.WhereStartsWith(query.FilterByProperty, query.FilterCompare);
            }
            else if (query.FilterByOperator == "EndsWith")
            {
                result = result.WhereEndsWith(query.FilterByProperty, query.FilterCompare);
            }
        }

        if (!string.IsNullOrEmpty(query.OrderByProperty))
        {
            if (query.Descending)
            {
                result = result.OrderBy(query.OrderByProperty);
            }
            else
            {
                result = result.OrderByDescending(query.OrderByProperty);
            }
        }

        result = result.Skip(query.Skip).Take(query.Amount);

        return result.ToList();
    }
}

これは間違いなくアンチパターンですが、必要に応じてデータを確認するための優れた方法です。次のように非常に簡単に呼び出されます。

DataQuery query = new DataQuery
{
    Amount = int.Parse(txtAmount.Text),
    Skip = 0,
    FilterByProperty = ddlFilterBy.SelectedValue,
    FilterByOperator = ddlOperator.SelectedValue,
    FilterCompare = txtCompare.Text,
    OrderByProperty = ddlOrderBy.SelectedValue,
    Descending = chkDescending.Checked
};

grdData.DataSource = DataService.GetData<Server>(query);
grdData.DataBind();

「サーバー」は、私が扱っているクラス/ドキュメント タイプの 1 つです。そのため、完全に動的ではないという欠点は、タイプごとにそのような呼び出しを定義する必要があることです。

4

1 に答える 1