【问题标题】:Error: "The method orderby must be called before the method skip" when trying to do Inner Join for ListView错误:尝试对 ListView 进行内部联接时,“必须在方法跳过之前调用方法 orderby”
【发布时间】:2019-06-08 19:52:30
【问题描述】:

目标:从两个不同的 sql server 表中获取信息以显示到 ListView 中。大多数来自 User 表,一个值来自 UserRole 表(尤其是“Description”字段)。

我一直在处理一系列错误。当前的一个是: “方法skip仅支持linq到实体的排序输入。方法orderby必须在方法skip之前调用” 正如所有 SO 帖子所提到的,我已经尝试将 OrderBy 添加到查询中,但我仍然收到错误消息。

问题:它(OrderBy)应该在其他地方吗?我的方向是否正确,或者是否有更好的实现将两个表连接到一个 ListView 中?

aspx:

    <asp:ListView id="lstUsers" runat="server" ItemType="Project.Classes.UserWRole" DataKeyNames="ID" SelectMethod="listUsers_GetData"
    OnItemCommand="lstUsers_ItemCommand" DeleteMethod="lstUsers_DeleteItem" OnSorting="lstUsers_Sorting"
     OnItemDataBound="lstUsers_ItemDataBound"
    ItemPlaceholderID="litPlaceHolder">

    <LayoutTemplate>
        <div class="table-responsive">
            <table class="table">
                <thead>
                    <tr>                            
                         <th>Username</th>
                        <th>TAX ID</th>
                        <th>Role</th>
                    </tr>
                </thead>
                <asp:Literal ID="litPlaceHolder" runat="server" />
            </table>
        </div>
    </LayoutTemplate>

    <ItemTemplate>
        <tr>                
            <td><%# Item.UserName %></td>
            <td><%# Item.Tax_ID %></td>
            <td> <%# Item.Description %></td>
        </tr>
    </ItemTemplate>

default.aspx.cs:

public IQueryable<UserWithRole> listUsers_GetData()
        {
            IQueryable<User> users = Project.Classes.Helper.UsersForUser(
                db: db,
                UserID: SessionManager.CurrentUserID,
                Search_User: Search_User,
                aUserRoleShortcut: SessionManager.CurrentUserRole
                ).OrderBy(i=>i.UserRoleID);



            IQueryable<UserRole> userRoles = db.UserRoles.OrderBy(i=>i.ID);

            IQueryable<UserWRole> myQuery = from user in users
                        join userRole in userRoles on user.UserRoleID equals userRole.ID
                        select new UserWRole{ ID = user.ID, LastName = user.LastName, FirstName = user.FirstName, OrgName = user.OrgName, UserName = user.UserName, Description = userRole.Description, Tax_ID = user.Tax_ID, DateAdded = user.DateAdded };


            if (users != null)
            {
                listNumSearchResults.Text = string.Format("{0} Results Found", users.Count());
                if (users.Count() > 10)
                {
                    ddlRecordsPerPage.Visible = true;
                    ltItemsPerPage.Visible = true;
                    ddlRecordsPerPage2.Visible = true;
                    ltItemsPerPage2.Visible = true;
                    dp1.Visible = true;
                }                   
            }

            return myQuery;
        }

UserWithRole.cs:

namespace Project.Classes
{
    public class UserWRole
    {
        public string LastName, FirstName, OrganizationName, UserName, Description, Tax_ID;
        public DateTime DateAdded;
        public int ID;
    }
}

helper.cs:

public static IQueryable<d.User> UsersForUser(d.ProjectPE db, int UserID, string Search_User, e.UserRoleEnum? aUserRoleShortcut)
        {
            IQueryable<d.User> users = null;                

            users = db.Users.OrderBy(a => a.LastName).AsQueryable();

            if (!string.IsNullOrEmpty(Search_User))
            {
                users = users.Where
                     (a =>
                          a.LastName.ToLower().StartsWith(Search_User.ToLower()) ||
                          a.FirstName.ToLower().StartsWith(Search_User.ToLower()) ||
                          a.UserName.ToLower().StartsWith(Search_User.ToLower())
                     ).AsQueryable();
            }

            users = users.Where(a => a.IsActive).AsQueryable();
            return users;
        }           

我希望看到第二个表中的列显示在 ListView 中,但我却收到了这些错误

【问题讨论】:

  • 您好,您可以尝试在 listUsers_GetData() 上的 OrderBy(i => i.userRole) 之后添加 ToList()
  • @pascalsanchez 我可以将它添加到用户和用户角色,但随后查询给出了类型转换错误。当我尝试将其更改为列表时,它显示“UserWRole 不包含 'ToList' 的定义”
  • 我认为您应该添加堆栈跟踪和包含Skip() 方法的方法,因为我没有看到您在当前代码中使用Skip() 扩展方法。 UserWRole 不能使用 ToList(),因为它是模型类,而不是集合类。
  • @TetsuyaYamamoto 当我搜索整个项目时,它在任何地方都找不到 Skip() 。 " 匹配行:0 匹配文件:0 "

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


【解决方案1】:

以下解决了这个问题:

https://docs.microsoft.com/en-us/dotnet/csharp/linq/order-the-results-of-a-join-clause

我通常使用方法语法,但没有意识到我使用此连接的语法错误地格式化了 orderby。我将 orderby 放在 join 和 select 之间,现在可以使用:

join uR in uRs on u.URID equals uR.ID
                    orderby uR.ID
                    select new UserWRole

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 2012-07-20
    • 2014-05-13
    • 2012-06-28
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多