LINQ to Entities无法识别方法“GetUserById”

时间:2017-06-13 21:57:47

标签: c# asp.net .net linq

我试过这样做(从数据库加载一些数据以通过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>

1 个答案:

答案 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);