【发布时间】: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