我试过这样做(从数据库加载一些数据以通过JSON发送) 但是我抓住了一个问题:
其他信息:LINQ to Entities无法识别该方法 'Model.Models.User GetUserById(Int32)'方法,而这个方法不行 被翻译成商店表达
如何避免此异常并获取每条记录所需的<div id="productsTable"></div>
<aui:script use="datatable,datatable-sort,datatable-scroll,datatable-highlight,datatable-selection,liferay-portlet-url">
var roleColumns = [ {
label : 'Providing Role Name',
key : 'providerRoleName',
sortable : true,
allowHTML : true,
formatter : function(o) {
var renderURL = Liferay.PortletURL
.createURL('<%= productDetailUrl %>');
renderURL.setParameter('productId', o.data.productId);
return '<a href="' + renderURL.toString() + '">'
+ o.data.providerRoleName + '</a>';
}
}, {
label : 'Cardinality',
key : 'cardinality',
sortable : true
} ];
new A.DataTable({
columns : roleColumns,
rowSelect: 'mousedown',
data : <%=renderRequest.getAttribute("roles")%>,
scrollable : "xy",
height : "400px",
width : '100%',
sort : 'true',
highlightRows : true
}).plug(A.Plugin.DataTableSelection, {
selectRow : true
}).render('#productsTable');
</aui:script>
答案 0 :(得分:4)
实体框架尝试将您的查询转换为SQL查询。但它无法将GetUserById
方法调用转换为SQL(这里不足为奇)。您应该将linq查询的这一部分移动到客户端:
var favList = context.FavoriteMessages
.Where(m => m.UserId == user.UserId && m.OnlineRoomId == user.OnlineRoomId)
.Select(m => new {
m.UserId, // return user id from database
m.Instance,
m.CreatedOn
})
.AsEnumerable() // further part of query is not translated into SQL
.Select(i => new {
UserName = userService.GetUserById(i.UserId).Name, // get name locally
i.Instance,
i.CreatedOn
}).ToList();
但是,如果您考虑过滤部分查询,则会看到您只选择userId等于user.UserId
的邮件。这意味着 - 所有选定的消息将具有相同的用户ID,更重要的是 - 这将是您已拥有的用户的ID。甚至更多 - 您已在User.Identity.Name
中拥有用户名。因此,查询应如下所示:
var user = userService.GetUserByName(User.Identity.Name);
var favorites = from m in context.FavoriteMessages
where m.UserId == user.UserId && m.OnlineRoomId == user.OnlineRoomId
select new {
UserName = user.Name,
m.Instance,
m.CreatedOn
};
return Json(favorites.ToList(), JsonRequestBehavior.AllowGet);