سؤال

لديّ iqueryable وكائن من النوع T.

أريد أن أفعل iqueryable (). حيث (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();

الذي يعمل بشكل مثالي ، الآن أنا فقط بحاجة إلى الجزء الثاني:

إرجاع Someiqueryable (). حيث (O => O.GetProperty (FieldName) == MatchValue) ؛

هل كانت مفيدة؟

المحلول

مثل ذلك:

    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, ، لكني أظن أنه سيكون على ما يرام "كما هو".

نصائح أخرى

من ما يمكنني رؤيته حتى الآن ، يجب أن يكون شيئًا مثل ...

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

على الرغم من أنه يمكنني الحصول على هذا لتجميع ، إلا أنه لا ينفذ تمامًا الطريقة التي مطلوب.

ماذا عن:

    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);
    }

هذه طريقة للحصول على قيم الخصائص عن طريق السلسلة دون استخدام الاستعلامات الديناميكية. الجانب السلبي هو قيم Al/سيتم محاذاة/غير محصورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top