[英]Is there a way to pass the DbSet<T> into the page?
我有页面的窗口。 该页面显示来自我的数据库的数据。 此外,在窗口上放置按钮,其内容根据数据库的表名称。 这些按钮切换页面的内容。
例如,这是btnUsers
按钮的点击事件,它显示“用户”表:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}
pageTable
是我的“通用”页面,它接收Users
类。 这是它的构造函数,它不起作用:
public pageTable(dynamic table, ...) {
InitializeComponent();
TableTemplate<dynamic>.Init(table, ...);
}
这是我的通用类,它在DbSet<T>
:
static class TableTemplate<T> {
internal static void Init(T table) {
foreach (string f in Foo(table, ...) {
...
}
}
}
Foo
方法只是从DbSet<T>
表中提取列:
internal static string Foo<T>(T item, ...) {
...
}
关键是,当我尝试从表中获取数据时,应用程序终止,在按钮的事件中,使用了这种通用方法。
我注意到,在Foo
方法中,在调试期间, T
类型是不同的,具体取决于我传递DbSet<T>
:
如果我显式初始化一个新的类实例(用于测试):
static class TableTemplate<T> { internal static void Init(T table) { foreach (string f in Foo(new Users(), ...) { ... } } }
,那么T
类型为System.Data.Entity.DynamicProxies.Users_E006B3...
, Foo
方法有效;
如果没有显式初始化, T
类型是System.Data.Entity.DbSet`1[Namespace.Users]
,并且Foo
方法不起作用。
是否有可能将通用实体类传递到页面中? 我不知道 XAML 是否有通用类支持,以使用通用pageTable<T>
页面。 这可能是一个解决方案,但我想有一种更简洁的方法来传递实体。
我找到了解决方案,它不使用通用页面。
好吧,当我尝试打印table
内容时,我发现将结构化查询传递给TableTemplate.Init()
。 我记得,以前从未使用dbContext.TableClass
作为函数参数,总是将TableClass
转换为列表。
我承认,我不了解 EntityFramework 并且没想到会出现这样的结果。 一般我用的是object
类型,已经忘记为什么用dynamic
类型了...
我决定将转换为列表的DbSet<T>
传递给页面的构造函数,而不是DbSet<T>
。 但是,因为我不使用常规页面,所以我将此列表的项目转换为object
:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users.ToList<object>()));
}
现在, pageTable
页面的构造函数是下一个:
public pageTable(List<object> table) {
InitializeComponent();
TableTemplate<object>.Init(table, ...);
}
并且,接下来是TableTemplate
类的Init
方法:
internal static void Init(List<T> tableList) {
if (tableList.Count > 0) {
foreach (string f in Foo(tableList[0], ...) {
...
}
}
}
如果tableList
为空,我还没有弄清楚如何只显示表的列名。 因此,在这种情况下,现在页面显示没有列名称的空DataGrid
。 尽管如此,我很高兴,这可以做到我想要的。
最后,我要说,间接同意Xerillio 的观点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.