Я не буду знать, какой тип содержит мой Enumerable, и я пытаюсь сделать его AsQueryable, чтобы я мог использовать Dynamic Linq.Например:
static string Query(object obj, string expression)
{
var q = ((IEnumerable<object>)obj).AsQueryable();
var a = q.Where(expression, "").First();
return a.ToString();
}
Я настроил тестовую программу (ниже), чтобы попробовать несколько вещей, но я не могу понять, как это сделать.Я получаю исключение. Отсутствует свойство или поле AddressId в типе 'Object'
, которое встречается в Dynamic.cs, в методе Expression ParseMemberAccess (тип Type, экземпляр Expression)
с использованием System.Linq.Dynamic;
class Address
{
public int AddressId { get; set; }
public string Street { get; set; }
}
class Program
{
static void Main(string[] args)
{
var a = new Address() { AddressId = 1, Street = "10 main st" };
var aList = new List<Address>();
aList.Add(a);
aList.Add(a);
var q1 = aList.AsQueryable();
var a1 = q1.Where(i => i.AddressId == 1).First();
var q2 = aList.AsQueryable();
var a2 = q2.Where("AddressId == @0", 1).First();
object obj3 = aList;
var q3 = ((IEnumerable<Address>)obj3).AsQueryable();
var a3 = q3.Where("AddressId == @0", 1).First();
//This case fails!
object obj4 = aList;
var q4 = ((IEnumerable<object>)obj4).AsQueryable();
var a4 = q4.Where("AddressId == @0", 1).First();
}
}
В ближайшем окне все q1, q2, q3, q4 выглядят одинаково - EnumerableQuery знает тип ...
{System.Collections.Generic.list 1[TestAsQueryable.Address]}
base {System.Linq.EnumerableQuery}: {System.Collections.Generic.List
1 [TestAsQueryable.Address]}