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", ...)
但是因为我没有类(它在另一个程序集中),所以我不能。
你的代码
var items = db.Database.SqlQuery(t, "SELECT * FROM @table", new SqlParameter("table", t.Name"));
返回DbRawSqlQuery而不是rows。
需要通过
访问items.GetEnumerator