3

こんにちは私は誰かが次のことで少しのガイダンスを提供できるかもしれないことを望んでいます:

リフレクションを使用し、一連のルールを受け取り、データソースから返されるデータを制限するための有効な式を作成できるジェネリック式フィルターを作成しようとしています。

私が抱えている問題は、次のシナリオを処理する式を作成する方法を理解しようとしていることです。

public class Item
{
    public string Name { get; set; }
    public List<TagTypes> TagTypes { get; set; }
}

public class TagTypes
{
    public string Name { get; set; }
    public List<Tags> Tags { get; set; }
}

public class Tags
{
    public string TagName { get; set; }
}

データは基本的に次のようになります

var itemList = new List<Item>
            {
                new Item
                {
                Name = "xyz",
                TagTypes = new List<TagTypes>
                    {
                        new TagTypes
                        {
                            Name = "Genre",
                            Tags = new List<Tags>
                                {
                                new Tags
                                    {
                                        TagName = "tag1"
                                    },
                                new Tags
                                    {
                                        TagName = "tag2"
                                    }        
                                }
                        }
                    }
               }

            };

'ジャンル'->'tag1'のフィルターに一致するすべてのアイテムを返す式を書きたい

私は以下を使用してこれを行うことができます:

var filtered = from item in itemList
from tagType in item.TagTypes
   where tagType.Name == "Genre"
      from tag in tagType.Tags
      where tag.TagName == "tag1"
select item

また、Itemクラスのプロパティで正常に機能する基本的な作業バージョンがありますが、TagTypes以下でSelectManyを実行する方法がわかりません。

基本レベルは次のとおりです

var parameter = Expression.Parameter(typeof(T), "itemList");
var property = GetPropertyInfo<T>({Propertyname});
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
Expression.Equal(propertyAccess, Expression.Constant({Value}));

編集

データはNoSQLデータベースに保存され、フィルターは動的であり、変更および追加できます。

リフレクションを使用してGenricFilterを作成する理由は、さまざまなフィルターが何であるかを事前に知らなくても対応できるようにするためです。ユーザーはフィルターIDを使用してデータをリクエストできるようになります。これにより、リクエスト内のフィルターに基づいてデータが選択されます。

4

1 に答える 1

0

あなたはこれを複雑にしすぎているのではないかと思います。

Expression<Func<Item>>またはを記述して、プロパティExpression<Func<List<Item>>を選択するだけです。Body

例えば

 Expression<Func<List<Item>> createListOfItems = () => new List<Item>
        {
            new Item
            {
            Name = "xyz",
            TagTypes = new List<TagTypes>
                {
                    new TagTypes
                    {
                        Name = "Genre",
                        Tags = new List<Tags>
                            {
                            new Tags
                                {
                                    TagName = "tag1"
                                },
                            new Tags
                                {
                                    TagName = "tag2"
                                }        
                            }
                    }
                }
           }

        };
于 2012-06-08T06:29:43.240 に答える