【问题标题】:Joining two tables with if-statements of what to present将两个表与要呈现的内容的 if 语句连接起来
【发布时间】:2014-04-30 21:05:07
【问题描述】:

我被困住了,希望有人能把我踢向正确的方向。

我有一个ListView,我一直在循环出单个数据库表中的数据,使用模型绑定来执行此操作(顺便说一句,Web 表单项目)。到现在为止还挺好。现在我需要检查另一个表中的一些值,以修改循环出来的对象的外观。基本上我想要做的是,我的ListView 中有 2 个按钮,如果我要加入的表中存在记录,则其中一个按钮应该获得visible = false 属性。

所以我一直在尝试编写一个 LINQ 查询来做到这一点,到目前为止没有太大的成功。

我编写的查询示例

var query2 = from l in myContext.Table1
                             join p in myContext.Table1.Where(p => p.pID == 1)
                             on l.pID equals p.pID
                             where l.UserId == 1

这仅返回我加入的表中确实存在的记录,我希望显示 Table1 中的所有记录 - 然后运行某种 if 语句来检查加入表中的记录是否存在,导致按钮显示或不显示。

更多信息,我正在使用 SelectMethod 返回 IQueryable

另外,由于使用模型绑定,我是否需要为这个连接对象声明一个新类,或者有没有更简单的方法(因为这只会在整个网站上使用一次)。

提前感谢任何提示或帮助!

更新

使用ListView 循环出我的数据

Default.aspx

    <asp:ListView ID="MyListView" runat="server" ItemType="Project.Models.Object" SelectMethod="MyListView_GetData">
        <ItemTemplate>
<!-- HERE i want to either add a button, or don't -->
        </ItemTemplate>
    </asp:ListView>

Default.aspx.cs

public IQueryable<Project.Models.Object> MyListView_GetData()
        {
            try
            {
                int qs2 = 2;
                var user = User.Identity.GetUserId().ToString();

                var query = from p in myContext.Object.Where(p => p.pID== qs2)
                            select p;

                foreach (var item in query)
                {
                    var doesExist = myContext.Object2.Any(m => m.eID == item.eID);

                    if (doesExist)
                    {
                        // Need to do something here?
                    }
                }

                return query.OrderByDescending(item => item.eID);
            }
            catch (Exception)
            {
                ModelState.AddModelError("", "Desc.");
                return null;
            }
        }

【问题讨论】:

  • 您想为列表视图中的每个项目添加一个按钮吗?还是整个列表视图只需一个按钮?
  • 我想为每个项目添加一个按钮——实际上,一个链接按钮或一个普通的

标签: c# sql sql-server linq webforms


【解决方案1】:

您可以使用 Any() 来检查记录是否存在。因此,如果您想检查是否存在 UserId 为 99 的记录,您可以这样做:

var doesExist = myContext.Table2.Any(m => m.UserId == 99);

返回一个布尔值。您可以轻松地使用该布尔值来设置您的按钮

button.Visible = !doesExist;

编辑您的评论:

完成第一个查询后,继续确定记录是否存在,然后根据结果切换按钮的可见性。

例如,如果您有一些名为 DoWork 的方法可以执行并填充您的列表框:

void DoWork() {
    ... execute your first query
    ... populate your listbox

    var doesExist = myContext.Table2.Any(m => m.UserId == 99);
    yourButton.Visible = !doesExist;
}

如果没有看到你的其余代码,我真的不能说你应该把它放在哪里。但是,既然您提到,“我希望显示 Table1 中的所有记录 - 然后运行某种 if 语句来检查连接表中的记录是否存在,从而导致显示或不显示按钮”,很明显,它必须在您的第一次查询之后发生。

【讨论】:

  • 谢谢!这似乎是解决我的问题的第一步!但是,我仍然不知道在哪里以及如何做到这一点。现在我有一个方法将 IQueryable 返回到我的 ListView,循环输出,比如 20 个项目,每个项目都有一个按钮。我可以在哪里放置这个 if 语句,在代码隐藏中还是应该直接在 .aspx 页面中进行?
  • 检查我的编辑。没有看到你的其余代码很难说。
  • 再次感谢,我明白了!我现在所做的是运行一个 foreach 循环,每次迭代都检查匹配项。现在是最后一个问题,因为我使用 ListView 来呈现这些数据(大约 20 个帖子),所以我不能使用按钮控件,因为我无法从我的代码隐藏(随机 id)中操作它。您是否也对如何解决这个问题有想法?我在想也许我可以为我的 Select 方法中的每个“”行添加一个控件,或者有更好的方法(我的可能甚至不是一个工作选项)。我现在正在用一些更相关的代码更新我的帖子!
  • 是的,让我看看其他代码。我在网络表单方面不是很有经验,但我会看看我能做什么。
  • 想通了!我所做的是在我的代码隐藏中创建一个方法,该方法检查现有记录,然后返回适当的字符串。就这么简单,非常感谢您以正确的方式发送给我。将此标记为答案!
猜你喜欢
  • 2019-05-05
  • 2017-08-27
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多