以下是提供背景信息,问题在底部
我正在尝试使用ASP.NET MVC 4构建一个完全动态的api。 我的数据库由LINQ to SQL
抽象化我的存储库类接收一个表示休息查询的数组
http://myUrl.com/countries/states/suburbs/24/street/
变成阵列
[countries,states,suburbs,24,street]
我希望我的存储库然后将该数组转换为这样的(这是伪代码):
context.countries.select("states").select("suburbs").where("suburbs.ID == 24").select("street")
我的想法是使用数组外部的常量对象遍历数组,并使用最新的对象。
object currentContextObj = null;
object currentUrlPart = null;
IQueryable<object> queryResult = null;
for (int i = 0; i < urlArray.Count(); i++)
{
我使用反射来理解上下文,找出数组的第一位。
if (currentContextObj == null)
{
if (currentUrlPart.GetType() != typeof(string))
throw new ArgumentException("URL part '" + currentUrlPart + "' is invalid");
currentContextObj = ((IEnumerable<object>)context.GetType().GetProperty((string)currentUrlPart).GetValue(context, null)).AsQueryable();
}
然后退出循环,下次我运行带动态linq
的select语句else if (currentUrlPart.GetType() == typeof(string))
{
currentContextObj = ((IQueryable)currentContextObj).Select((string)currentUrlPart).AsQueryable();
}
这很好,直到它再次循环,在数组的第三部分,currentContextObj不是一个可查询的,它是一个数据查询,如果我在调试时将鼠标悬停在它上面,它显示生成的sql语句,所以当我运行它时相同的((IQueryable)currentContextObj).Select((string)currentUrlPart).AsQueryable();
错误:
No property or field 'Suburbs' exists in type 'EntitySet 1'
。
我使用的是动态linq,因为这些类型都是匿名的。我的另一个尝试试图找到可枚举类的select方法并在currentContextObj上调用它。没有用,因为currentContextObj试图在它是一个表时强制转换为枚举,而我无法转换为表,因为我不知道T直到运行时。
我知道这是很多信息,但我会列出我要问的内容: