1

以下是提供上下文,问题在底部

我正在尝试使用 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。

我知道这是很多信息,但我会列出我要问的内容:

  1. 我应该做 .select().select().where().select()... 等等还是应该去 .join().join().where().select()
  2. 是否有可能避免我在动态 LINQ 的错误中遇到的这个问题?
  3. 这个问题有替代解决方案吗?
4

0 回答 0