我正在尝试在我的应用程序中的Devexpress Grid中实现Server mode 网格视图需要可查询的源,因此我不想使用ToList()或AsEnumerable(将所有数据加载到应用程序内存中)。 当我使用AsQueryable时,我得到LINQ to Entities无法识别方法......
查询详情 表中的一列(定义)存储为JSON字符串。我知道它正试图找到反序列化方法的SQL等价物,如果您知道任何其他选择,请建议。
以下是查询。
var requestList = (from request in db.request_def
let requestDefinition=new JavaScriptSerializer().Deserialize(request.Definition,typeof(RequestInfo))
let user = db.Users.FirstOrDefault(p => p.PRINCIPAL == requestDefinition.Principal)
let processingAccount =user.EMAIL
select new RequestModel
{
CreatedBy = request.CreatedBy
CreatedOn = request.CreateOn,
Status = request.Status,
ProcessingAccount = processingAccount,
}).OrderByDescending(p => p.CreatedOn).AsQueryable<RequestModel>();
答案 0 :(得分:2)
您似乎在数据库中存储了一个JSON字符串,但您仍然想要加入&#34;它到另一张桌子。您的选择可能仅限于以下之一:
Principal
)复制到其自己的列中,这样您就可以进行经典的SQL连接,实现代码中的数据和然后反序列化它。答案 1 :(得分:1)
从查询中排除ProcessingAccount字段,以便能够在服务器端执行它并检索数据。相反,将“定义”字段添加到RequestModel。然后,add an unbound column,您将在其中手动加载ProcessingAccount数据。
为此,请处理CustomUnboundColumnData事件。在事件处理程序中,使用ASPxGridColumnDataEventArgs.GetListSourceFieldValue方法获取当前记录的Definition,对其进行反序列化,然后从数据库中加载User以获取ProcessingAccount。
要减少数据库查询量,最好检索当前页面中所有记录的“定义”值,并批量加载所有相关用户。您可以在第一次调用CustomUnboundColumnData事件处理程序时执行此操作,并将结果存储在本地变量中,以便在后续调用中使用它。