Могу ли я сгенерировать выражение linq динамически в C #?

В настоящее время у меня есть кусок Linq, который выглядит примерно так;

<code>List<dynamic> childrenToBeRemoved = this.ItemsSource.Where(o => o.ParentID == "1234").ToList();
</code>

где ItemsSource - это ObservableCollection динамики.

Это работает нормально, но проблема, с которой я столкнулся, состоит в том, что ParentID - это свойство, которое может изменяться. Например. это может быть названо ParentPkey или ParentKey и т. д.

Могу ли я создать выражение, в котором я могу указать свойство, которое я хочу использовать в моем сравнении?

Я пытался использовать динамический linq, но он не работает, используя набор динамиков, отлично работает с набором pocos.

Спасибо...

 James Holmes08 мая 2012 г., 13:45
yes, you can но кажется, что вы используете динамический дробовик, чтобы убить статичную муху.
 Mark D08 мая 2012 г., 13:54
Условие такое же, но свойство, которое я использую в этом выражении, может измениться, я смотрю на построение условия с помощью построителя дерева выражений, но, по-вашему, это похоже на массивный молоток и очень маленький гвоздь. Учитывая, что свойство может меняться, как бы первый Func & lt; Titem, bool & gt; подход похож?
 Andreas Niedermair08 мая 2012 г., 13:54
почему собственность меняется ?! (кстати - если свойство отличается, само условие также отличается!)
 Andreas Niedermair08 мая 2012 г., 13:55
@ Бенди посмотри мой ответ о том, как ты можешь использоватьFunc<TItem, bool>-подход
 Andreas Niedermair08 мая 2012 г., 13:36
почему состояние может меняться? ... почему бы не сделатьFunc<TItem, bool> который вы затем вводите какthis.ItemSource.Where(myFunc) вместо того, чтобы сделать сам параметр динамическим (это все еще возможно, но издержки в выражениях и обобщениях могут не стоить того)?

Ответы на вопрос(4)

параметра.

PropertyInfo parentProp = itemType.GetProperty("ParentKey or whatever");
List<dynamic> childrenToBeRemoved = this.ItemsSource.Where(o => Equals("1234", parentProp.GetValue(o, null))).ToList();
 08 мая 2012 г., 14:03
Аргл ...this.ItemsSource.Where(o => null.Equals(o.foo)) ... :) ... вы должны использоватьthis.ItemsSource.Where(o => Equals(null, o.foo)) вместо
 08 мая 2012 г., 13:51
Да, он даже не скомпилируется, я исправил более надежное использование Equals
 08 мая 2012 г., 13:43
этот тип безопасен? Что делать, если свойство не typeofSystem.String?
 08 мая 2012 г., 14:01
Соглашение состоит в том, чтобы возвращать false для Equals (null), что имеет место для string.Equals. Так что нет проблем с этим.
 08 мая 2012 г., 13:56
и как вы могли бы сравнить сnull? :) ... почему бы не использоватьEquals() (статическая реализация наSystem.Object)? Основная проблема, с которой вы столкнетесь в этом сценарии, заключается в том, что вам придется получить все записи в свой домен, поскольку это сравнение не может быть переведено в EF или что-то подобное ...

намический вызов!

IEnumerable<MyItem> result;
if (condition1)
{
    result = this.Items.Where(arg => arg.ProductId == "123");
}
else if (condition2)
{
    result = this.Items.Where(arg => arg.ProductPK == "123");
}

или же

Func<Item, bool> predicate;
if (condition1)
{
    predicate = item => item.ProductId == "123";
}
else if (condition2)
{
    predicate = item => item.ProductPK == "123";
}
var result = this.Items.Where(predicate);

Оооо ... Я полагаю, что вы должны рассказать нам больше о вашей реальной проблеме - я не вижу какой-либо текущей необходимости для реализации sth - так что, я считаю, что ваше требование не определено!

является ли запрос динамическим linq или нет

Expression<Func<Entity, int>> predicate = x => x.Id == myvalue;
from entity in _context.Entities.Where(predicate)
select entity;

Проверьте PredicateBuilder из LinkKit @http://www.albahari.com/nutshell/linqkit.aspx там тоже достаточно примеров

Ответственность за перевод выражения в соответствующий sql лежит на поставщике linq, поэтому убедитесь, что используемый вами поставщик поддерживает соответствующие аспекты

Ваш ответ на вопрос