EntityFramework SqlQuery和Reflection

时间:2015-05-18 06:23:06

标签: c# entity-framework reflection

我一直在尝试为我正在编写的自定义CMS生成多个网站的SiteMap。

我的情况如下: 我在一个名为SiteMapItem的汇编中有一个类:

public abstract class SiteMapItem
{
    public abstract string Url { get; }
}

我在另一个扩展SiteMapItem的程序集中有三个单独的类:

public class Team : SiteMapItem
{ ... }

public class Partner : SiteMapItem
{ ... }

public class Project : SiteMapItem
{ ... }

在要生成SiteMap的程序集中,我运行以下代码以获取具有IsSubClassOf(typeof(SiteMapItem))的类型列表:

foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
    if (a.GetTypes().Any(t => t.IsSubclassOf(typeof(SiteMapItem))))
    {
        winner = a;
    }
}

获得优胜者后,我会获得包含IsSubClassOf SiteMapItem的类型列表:

List<Type> types = winner.GetTypes().Where(p => p.IsSubclassOf(typeof(SiteMapItem))).ToList();

然后我迭代types来运行db.Database.SqlQuery - 这就是我被困住的地方(db是一个DataContext):

var items = db.Database.SqlQuery(t, "SELECT * FROM @table", new SqlParameter("table", t.Name"));

以上代码什么都不返回,在调试时,每次迭代都正确设置了类型,但是当我检查items并尝试评估结果时,我收到错误Children could not be evaluated

我通常会使用替代方法:

db.Database.SqlQuery<T>("SELECT * FROM @fdsfdsa", ...) 

但因为我没有一个类(它在另一个组件中)我不能。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的代码

var items = db.Database.SqlQuery(t, "SELECT * FROM @table", new SqlParameter("table", t.Name"));

返回DbRawSqlQuery而不是行。

您需要通过

访问
items.GetEnumerator