Система.Linq.Динамический.Ядро не может привести тип «объект» к типу » Кортеж»

#c# #linq #dynamic-linq

Вопрос:

Я использую System.Linq.Dynamic.Core и пытается выполнить динамический запрос с моделью, как показано ниже:

 public class Index
{
    public long Position { get; set; }

    public object[] Values { get; set; }
}
 

И с образцом данных, подобных этому:

 var indexes = new Dictionary<long, Index>();
indexes.Add(1, new Index { Position = 1000, Values = new object[3] { "Welly", "Chandra", Tuple.Create<int, int>(1, 2) } });
indexes.Add(2, new Index { Position = 1001, Values = new object[3] { "Darma", "Angelo", Tuple.Create<int, int>(3, 4) } });
indexes.Add(3, new Index { Position = 1002, Values = new object[3] { "Abby", "Yeremia", Tuple.Create<int, int>(5, 6)} });
indexes.Add(4, new Index { Position = 1003, Values = new object[3] { "Yonathan", "Gunawan", Tuple.Create<int, int>(7, 8)} });
indexes.Add(5, new Index { Position = 1004, Values = new object[3] { "Aldy", "Santoso", Tuple.Create<int, int>(11, 12)} });
var queryable = indexes.Values.AsQueryable();
var result = queryable.Where("Values[1].Equals("Yeremia") || ((Tuple<int, int>) Values[2]).Item2.Equals(8)").ToList();
 

Но это всегда вызывает исключение:

 Exception: No property or field 'Tuple' exists in ...
 

Разве это невозможно использовать type-casting при запросе здесь?

Ответ №1:

Я не понимаю, почему вы пишете строку внутри предложения linq where.

Ниже приведен полностью рабочий код с моей стороны.

 var indexes = new Dictionary<long, Index>();
            indexes.Add(1, new Index { Position = 1000, Values = new object[3] { "Welly", "Chandra", Tuple.Create<int, int>(1, 2) } });
            indexes.Add(2, new Index { Position = 1001, Values = new object[3] { "Darma", "Angelo", Tuple.Create<int, int>(3, 4) } });
            indexes.Add(3, new Index { Position = 1002, Values = new object[3] { "Abby", "Yeremia", Tuple.Create<int, int>(5, 6) } });
            indexes.Add(4, new Index { Position = 1003, Values = new object[3] { "Yonathan", "Gunawan", Tuple.Create<int, int>(7, 8) } });
            indexes.Add(5, new Index { Position = 1004, Values = new object[3] { "Aldy", "Santoso", Tuple.Create<int, int>(11, 12) } });
            var queryable = indexes.Values.AsQueryable();
            var result = queryable.Where(cc=>cc.Values[1].Equals("Yeremia") || ((Tuple<int, int>) cc.Values[2]).Item2.Equals(8)).ToList();
 

ОБНОВЛЕНИЕ: Это работает на меня. Преобразование типов не требуется.

  var indexes = new Dictionary<long, Index>();
            indexes.Add(1, new Index { Position = 1000, Values = new object[3] { "Welly", "Chandra", Tuple.Create<int, int>(1, 2) } });
            indexes.Add(2, new Index { Position = 1001, Values = new object[3] { "Darma", "Angelo", Tuple.Create<int, int>(3, 4) } });
            indexes.Add(3, new Index { Position = 1002, Values = new object[3] { "Abby", "Yeremia", Tuple.Create<int, int>(5, 6) } });
            indexes.Add(4, new Index { Position = 1003, Values = new object[3] { "Yonathan", "Gunawan", Tuple.Create<int, int>(7, 8) } });
            indexes.Add(5, new Index { Position = 1004, Values = new object[3] { "Aldy", "Santoso", Tuple.Create<int, int>(11, 12) } });
            var queryable = indexes.Values.AsQueryable();
            var result = queryable.Where("Values[1].Equals("Yeremia") || Values[2].Item2.Equals(8)").ToList();
 

Комментарии:

1. Поскольку я создаю динамический конструктор строк запросов, подобный SQL, в своем бэкэнде, поэтому мне нужно создать строку в качестве параметра Where(…)

2. Если вы используете linq, то вам нужно поработать над выражением, чтобы сделать динамический запрос. Кроме того, если приведенный выше код компилируется на вашей машине, это означает, что вы используете что-то еще, о чем вы не упомянули в своем коде.

3. Да, я использую github.com/zzzprojects/System.Linq. Библиотека Dynamic.Core , как указано в названии вопроса, как System.Linq.Dynamic.Core .

4. Это бросает Exception: Target object is not an ExpandoObject сюда