c# - 使用 LINQ 访问 FK 相关表中的信息

标签 c# asp.net linq linq-to-sql database-design

我正在开发一个员工调度系统。我认为我的数据库设置得很好,但在提取数据库数据并将其显示到页面上时遇到了障碍。我使用 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 类成员...或者我是这么想的!

编辑:这是调试时捕获的变量的几个屏幕截图。

e.Result | 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”的属性。

您有多种选择。

  1. 执行您最初执行的操作,并在 LINQ 表达式中对 x.aspnet_User 而不是 x 进行分组。然后,CheckBoxList 迭代的内容将是一个 IGrouping,它将具有可用的属性“UserName”和“UserId”。
  2. 避免使用 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/

相关文章:

c# - 如何在 C# 中检索 azure 安全组

c# - 数据库验证错误。在一个表中允许空值,但在相关(规范化)表中不允许空值

linq - 无法转换对象

c# - 如何使用 Linq to object 构建层次结构?

c# - Polly 使用不同的 url 重试

c# - 正文加载事件执行后在 WinForms WebBrowser 中获取 HTML 正文内容

c# - .NET 5 vNext 使用参数解决依赖关系

c# - 无法将 CommandTimeout 设置为超过 90 秒

asp.net - asp.net mvc中 session 状态超时完成后如何重定向到登录页面

linq - 删除两个 List<string> 集合之间的重叠项目