LINQ to Entities无法识别反序列化方法

时间:2017-03-19 19:45:35

标签: c# sql entity-framework linq devexpress

我正在尝试在我的应用程序中的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>();

2 个答案:

答案 0 :(得分:2)

您似乎在数据库中存储了一个JSON字符串,但您仍然想要加入&#34;它到另一张桌子。您的选择可能仅限于以下之一:

  1. 将整个表拖入内存,反序列化并在那里进行JOIN。这可能会非常缓慢 - 不要这样做。
  2. 转移到设计为这样查询的数据存储(即MongodDB,DocumentDB等)。
  3. 当您将JSON插入表中时,将值(即Principal)复制到其自己的列中,这样您就可以进行经典的SQL连接,实现代码中的数据和然后反序列化它。
  4. 如果您运行的是SQL Server 2016或更高版本,那么您应该能够使用SQL Server JSON query
  5. 对数据库运行原始SQL查询

答案 1 :(得分:1)

从查询中排除ProcessingAccount字段,以便能够在服务器端执行它并检索数据。相反,将“定义”字段添加到RequestModel。然后,add an unbound column,您将在其中手动加载ProcessingAccount数据。

为此,请处理CustomUnboundColumnData事件。在事件处理程序中,使用ASPxGridColumnDataEventArgs.GetListSourceFieldValue方法获取当前记录的Definition,对其进行反序列化,然后从数据库中加载User以获取ProcessingAccount。

要减少数据库查询量,最好检索当前页面中所有记录的“定义”值,并批量加载所有相关用户。您可以在第一次调用CustomUnboundColumnData事件处理程序时执行此操作,并将结果存储在本地变量中,以便在后续调用中使用它。