EntityFramework SqlQuery and Reflection

本文关键字:Reflection and SqlQuery EntityFramework | 更新日期: 2023-09-27 17:49:28

我一直在尝试为我正在编写的自定义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", ...) 

但是因为我没有类(它在另一个程序集中),所以我不能。

EntityFramework SqlQuery and Reflection

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

返回DbRawSqlQuery而不是rows。

需要通过

访问
items.GetEnumerator