【问题标题】:LINQ to Entities does not recognize deserialize methodLINQ to Entities 无法识别反序列化方法
【发布时间】:2017-03-19 19:45:34
【问题描述】:

我正在尝试在我的应用程序的 Devexpress Grid 之一中实现 Server mode
网格视图需要可查询的源,所以我不想使用 ToList() 或 AsEnumerable(将所有数据加载到应用程序内存中)。 当我使用 AsQueryable 时,我得到 LINQ to Entities 无法识别该方法...

查询详情: 表中的一列(定义)存储为 JSON 字符串。我知道它正在尝试为 Deserialize 方法找到等效的 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>();

【问题讨论】:

  • 您希望您的数据库(或 EF)如何理解 new JavaScriptSerializer().Deserialize(request.Definition,typeof(RequestInfo)) 应该做什么?数据库对上述任何事情一无所知。
  • 我知道数据库不理解反序列化方法,想知道是否有没有反序列化的替代方法,我们可以编写一些自定义扩展方法......
  • SQL server 2016 可以使用 json,因此您可以使用原始 sql 查询而不是 EF,或者使用请求创建 sql 视图。描述已经解析并使用它而不是 request_def 表(例如的替代)。

标签: c# sql entity-framework linq devexpress


【解决方案1】:

您似乎在数据库中存储了一个 JSON 字符串,但您仍想将其“加入”到另一个表中。您的选择可能仅限于以下之一:

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

【讨论】:

  • 我们在 SQL Server 2012 上运行,所以选择了选项 3 - 创建单独的列。感谢您的建议。
【解决方案2】:

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

为此,请处理CustomUnboundColumnData 事件。在事件处理器中,通过ASPxGridColumnDataEventArgs.GetListSourceFieldValue方法获取当前记录的Definition,反序列化,从数据库中加载User,获取ProcessingAccount。

为了减少数据库查询量,最好是检索当前页面中所有记录的Definition值,并批量加载所有相关Users。您可以在第一次调用 CustomUnboundColumnData 事件处理程序时执行此操作,并将结果存储在局部变量中以在后续调用中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2012-04-03
    • 2021-11-06
    • 2012-05-03
    相关资源
    最近更新 更多