【问题标题】:ASPX page has duplicate row(s) even though they are not duplicated in SQLASPX 页面有重复的行,即使它们在 SQL 中没有重复
【发布时间】:2019-03-07 23:30:59
【问题描述】:

问题:只要有相同的“计划”,SQL 中的一行就会被复制到网页上

我已经尝试检查语句的 Where 和 OrderBy,看看这是否会影响重复的原因。我不确定为什么 OrderBy 会创建重复项。我已经对多个用户进行了尝试,并且当他们拥有相同的计划时行为是一致的。

示例如下:

代码(.cs):

var someVariable = DbContext.DbSet<>.Where(
                    m =>
                        m.Some_ID == CurrentlyEditingSomeID
                    ).AsQueryable().OrderByDescending(m => m.Start_Date); 

这引用了 .aspx 页面中的 ListView,其中包含如下项目:

   <td style="width: 20%;"><%# Item.Plan %></td>
                <td style="width: 20%;"><%# Item.Start_Date.ToSafeShortDate() %></td>
                <td style="width: 20%;"><%# Item.End_Date.ToSafeShortDate() %></td>

LINQ 查询的输出:

SELECT 
[Project1].[Field1] AS [Field1], 
[Project1].[Field2] AS [Field2], 

FROM ( SELECT 
    [Extent1].[Field1] AS [Field1], 
    [Extent1].[Field2] AS [Field2], 

    FROM (SELECT 
[VIEW].[Field1] AS [Field1], 
[VIEW].[Field2] AS [Field2], 

FROM [mWeb].[VIEW] AS [VIEW]) AS [Extent1]
    WHERE [Extent1].[Some_ID] = @p__linq__0
)  AS [Project1]
ORDER BY [Project1].[Start_Date] DESC

(.aspx 文件的较长版本):

<asp:ListView ID="lstPlanE" runat="server" ItemPlaceholderID="litPlanEPlaceHolder"
        ItemType="Project.Data.view" SelectMethod="lstPlanE_GetData">
        <EmptyDataTemplate>
            <div class="alert alert-danger" role="alert">Nothing found</div>
        </EmptyDataTemplate>
        <LayoutTemplate>
            <div class="table-responsive">
                <table class="table">
                    <thead>
                        <tr>
                            <th style="width: 20%;">G</th>
                            <th style="width: 20%;">G ID</th>
                            <th style="width: 20%;">Plan</th>
                            <th style="width: 20%;">Start Date</th>
                            <th style="width: 20%;">End Date</th>
                        </tr>
                    </thead>
                    <asp:Literal ID="litPlanEPlaceHolder" runat="server" />
                </table>
            </div>
        </LayoutTemplate>

            <ItemTemplate>
                <tr>
                    <td style="width: 20%;"><%# Item.G_Description %></td>

                       <% if (isAAA()) %> 
                       <% {  %>   
                                     <td><%# Item.AAA_G_ID %></td> 
                       <% } %>

                       <% else %>
                       <% { %>
                                 <td><%# Item.G_ID %></td>
                       <% } %>



                    <td style="width: 20%;"><%# Item.Plan %></td>
                    <td style="width: 20%;"><%# Item.Start_Date.ToSafeShortDate() %></td>
                    <td style="width: 20%;"><%# Item.End_Date.ToSafeShortDate() %></td>

                </tr>
            </ItemTemplate>
    </asp:ListView>

(.cs 文件中方法的较长版本):

public IQueryable<MediView.Data.vx_EligibilitySearch> lstPlanE_GetData()
        {
            try
            {
                if (isAAA())
                {
                    var someVariable = DbContext.DbSet<>.Where(
                        m =>
                            m.Other_ID == CurrentlyEditingOtherID &&
                            m.Some_Seq == CurrentlyEditingSomeSeqID
                        ).AsQueryable();
                    return someVariable;
                }
                else
                {

                    var someVariable = DbContext.DbSet<>.Where(
                    m =>
                        m.Some_ID == CurrentlyEditingSomeID
                    ).AsQueryable().OrderByDescending(m => m.Start_Date); 

                    return someVariable;
                }

            }
            catch (Exception ex)
            {
                ErrorSignal.FromCurrentContext().Raise(ex);
            }
            return null;
        }

public bool isAAA() // Determines if Site is CCC or Other
    {
        bool isSiteCCC = false;
        String browserTab = Properties.Settings.Default.BrowserTab.Trim(); // Gets Site Name from Settings file

        if (browserTab.Equals("Some Site Name")) { isSiteCCC = true; }

        return isSiteAAA;
    }

【问题讨论】:

  • 也许您正在重新分配 Item 对象,而不是让它循环?从您的第二个 SQL 行的外观来看,情况可能就是这样。如果您发布更多代码,也许会很清楚。
  • 我更新了代码和输出。也许它会带来一些启示。
  • 您的 linq 调用对我来说看起来不错,因此它应该正确返回所有项目。这会让我同意克里斯托弗的观点。我假设您没有遍历返回的列表,而是两次显示最后一项。同样,如果您可以显示更多代码,它会给我们一个更好的主意。
  • 很高兴提供更多代码,什么最有帮助?
  • 将评论移至放置代码的潜在答案

标签: c# asp.net sql-server listview duplicates


【解决方案1】:

我进行的两项更改已解决:在 OrderBy 中从开始日期更改为结束日期。 也将其更改为 AsNoTracking。

经过测试,唯一真正起作用的是 AsNoTracking() 方法。

也许有人可以解释为什么会这样??

else
            {

                var someVariable = DbContext.DbSet<>.AsNoTracking().Where(
                m =>
                    m.Some_ID == CurrentlyEditingSomeID
                ).AsQueryable().OrderByDescending(m => m.End_Date); 

                return someVariable;
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2017-10-27
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多