我正在开发一个员工调度系统。我认为我的数据库设置得很好,但在提取数据库数据并将其显示到页面上时遇到了障碍。我使用 LINQ 是为了让自己的事情变得简单。
Here是对象关系图。
这是我的 Linq select 语句:
protected void LinqSelecting(object sender, LinqDataSourceSelectEventArgs e) {
MilhouseDataClassesDataContext mdb = new MilhouseDataClassesDataContext();
e.Result = from x in mdb.MilhouseHours
group x by x.HourString into hour
select new {
hourStr=hour.Key,
uName=hour};
}
以下是我的 GridView 代码的相关部分:
<asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1" AutoGenerateColumns="false">
<asp:TemplateField HeaderText="Sunday">
<ItemTemplate>
<asp:CheckBoxList ID="shiftsSun" runat="server" DataSource='<%#Eval("uName")%>' DataValueField="UserId" />
</ItemTemplate>
</asp:TemplateField>
...
</asp:Gridview>
这将正确显示数据库中的用户 ID,但我希望它显示用户名。我实现此显示工作的唯一方法是将我的组声明更改为:
group x.aspnet_User by x.HourString into hour
我想我在这里错过了一个大概念。通过使用组,我应该可以通过匿名类的 uName 成员访问 aspnet_user 类成员...或者我是这么想的!
编辑:这是调试时捕获的变量的几个屏幕截图。
我的最终目标是拥有一个 GridView ,它将在每个单元格中显示 y 天 x 小时的工作轮类列表。任何设计或代码帮助将不胜感激。我似乎无法理解这个问题。
最佳答案
正在迭代包含 MilhouseHour 对象的集合:IGrouping。 MilhouseHour 确实包含对 aspnet_User 的引用,但您要引用的名称(和 id)是 aspnet_User 的属性,而不是 MilhouseHour。理想情况下,您可以编写如下标记
<asp:CheckBoxList ID="shiftsSun" runat="server"
DataSource='<%#Eval("hourUsers")%>'
DataTextField = "aspnet_User.UserName"
DataValueField = "aspnet_User.UserId" />
但这会产生错误。 ASP.Net 在 DataTextField 中期望的是它将在相关对象上调用(可能通过反射)的属性名称,而不是要计算的表达式。有问题的对象是 MilhouseHour,它没有名为“aspnet_User.UserName”的属性。
您有多种选择。
- 执行您最初执行的操作,并在 LINQ 表达式中对 x.aspnet_User 而不是 x 进行分组。然后,CheckBoxList 迭代的内容将是一个 IGrouping,它将具有可用的属性“UserName”和“UserId”。
避免使用 CheckBoxList 并使用一些可以让您更明确地控制内部循环中的代码的东西,例如转发器:
<asp:TemplateField HeaderText="Sunday"> <ItemTemplate> <asp:Repeater ID="shiftsSun" runat="server" DataSource='<%#Eval("hourUsers")%>'> <ItemTemplate> <asp:CheckBox runat="server" Text='<%# Eval("aspnet_User.UserName") %>' Value='<%# Eval("aspnet_User.UserId") %>' /> <br /> </ItemTemplate> </asp:Repeater> </ItemTemplate>
可能还有更多选择,但这就是我目前想到的。
关于c# - 使用 LINQ 访问 FK 相关表中的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827777/