4

IQueryable と T 型のオブジェクトがあります。

IQueryable().Where(o => o.GetProperty(fieldName) == objectOfTypeT.GetProperty(fieldName)) を実行したい

それで ...

public IQueryable<T> DoWork<T>(string fieldName)
        where T : EntityObject
{
   ...
   T objectOfTypeT = ...;
   ....
   return SomeIQueryable<T>().Where(o => o.GetProperty(fieldName) == objectOfTypeT.GetProperty(fieldName));
}

参考までに、GetProperty は有効な関数ではありません。この機能を実行するものが必要です。

金曜日の午後に脳が溶けてしまっているのでしょうか、それとも複雑なことでしょうか?


objectOfTypeT 次のことができます...

var matchToValue = Expression.Lambda(ParameterExpression
.Property(ParameterExpression.Constant(item), "CustomerKey"))
.Compile().DynamicInvoke();

これは完全に機能しますが、今は2番目の部分が必要です:

return SomeIQueryable().Where(o => o.GetProperty(fieldName) == matchValue);

4

3 に答える 3

4

そのようです:

    var param = Expression.Parameter(typeof(T), "o");
    var fixedItem = Expression.Constant(objectOfTypeT, typeof(T));
    var body = Expression.Equal(
        Expression.PropertyOrField(param, fieldName),
        Expression.PropertyOrField(fixedItem, fieldName));
    var lambda = Expression.Lambda<Func<T,bool>>(body,param);
    return source.Where(lambda);

私は、多くの表現に関するトピックをカバーするブログを開始しまし

問題が発生した場合は、objectOfTypeT最初に (リフレクションを使用して) から値を抽出し、その値を で使用するという別のオプションがありExpression.Constantますが、「そのまま」で問題ないと思います。

于 2008-10-24T03:57:18.670 に答える
0

これまでのところ、私が見ることができるものから、それは次のようなものでなければなりません...

IQueryable<T>().Where(t => 
MemberExpression.Property(MemberExpression.Constant(t), fieldName) == 
ParameterExpression.Property(ParameterExpression.Constant(item), fieldName));

これをコンパイルすることはできますが、必要な方法で完全に実行することはできません。

于 2008-10-24T02:29:03.247 に答える
0

どうですか:

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

    }

    public Func<T, TRes> GetPropertyFunc<T, TRes>(string propertyName)
    {
        // get the propertyinfo of that property.
        PropertyInfo propInfo = typeof(T).GetProperty(propertyName);

        // reference the propertyinfo to get the value directly.
        return (obj) => { return (TRes)propInfo.GetValue(obj, null); };
    }

    public void Run()
    {
        List<Person> personList = new List<Person>();

        // fill with some data
        personList.Add(new Person { Name = "John", Age = 45 });
        personList.Add(new Person { Name = "Michael", Age = 31 });
        personList.Add(new Person { Name = "Rose", Age = 63 });

        // create a lookup functions  (should be executed ones)
        Func<Person, string> GetNameValue = GetPropertyFunc<Person, string>("Name");
        Func<Person, int> GetAgeValue = GetPropertyFunc<Person, int>("Age");


        // filter the list on name
        IEnumerable<Person> filteredOnName = personList.Where(item => GetNameValue(item) == "Michael");
        // filter the list on age > 35
        IEnumerable<Person> filteredOnAge = personList.Where(item => GetAgeValue(item) > 35);
    }

これは、動的クエリを使用せずに文字列でプロパティの値を取得する方法です。欠点は、すべての値がボックス化/非ボックス化されることです。

于 2012-04-04T19:14:43.420 に答える