.NET IQueryable MSSQL和ASP.NET WebAPI

时间:2018-09-27 20:56:38

标签: c# .net sql-server wpf asp.net-web-api

案件正在追踪。

WPF应用程序中有DataGrid,它使用IQueryable作为ItemsSource(应用过滤,排序,分组,聚合等),如果从应用程序中我们使用EF直接连接到DB,则我们有MSSQL Server数据库存储数据DbSet <>或ADO.NET Table <>一切都很好。我们不希望该应用程序直接访问数据库,而目的是在它们之间使用WebAPI。 DataGrid有自己的查询生成器表达式,生成的查询看起来像

.Call System.Linq.Queryable.Select(
.Call System.Linq.Queryable.GroupBy(
    .Call System.Linq.Queryable.Select(
        .Constant<Reports.ReportQuery>(Query(RepoService.Flight)),
        '(.Lambda #Lambda1<System.Func`2[RepoService.Flight,DynamicClass1]>)),
    '(.Lambda #Lambda2<System.Func`2[DynamicClass1,DynamicClass2]>)),
'(.Lambda #Lambda3<System.Func`2[System.Linq.IGrouping`2[DynamicClass2,DynamicClass1],Telerik.Pivot.Core.PivotResultItem]>))

据我了解,OData不适合我们的情况。我们试图做的是在提供者Execute方法中创建我们的自定义IQueryable和IQueryProvider获取查询表达式,以将其发送到WebAPI,然后在DBAPI上执行它,将结果发送回并从提供者Execute方法返回该结果。

1)这样是否正确/可行?

2)是否有针对这种情况的现有解决方案?

2 个答案:

答案 0 :(得分:0)

也许我无法正确理解您可能会问的所有内容,但我会尝试回答。

如果使用WPF直接与SQL Server对话,它将通过驱动程序使用特殊协议。有很多文章可以轻松地公开SQL Server,因为可能还有MS Azure托管的SQL Server等。这只是在您可能想到回到SQL Server的情况下。

如果您选择通过WebAPI来实现后端的途径,那么您要确保实现所有需要查询应用程序中所需信息的后端路由。 OData是一种基于http的查询语言协议。因此,它实现了您需要使用WebApi自行重建的所有查询语法。

尽管如此,如果没有看到您的任何代码,很难发现任何错误。 但是...这是一个教程,如何通过http客户端库查询Web服务并在wpf datagrid中显示信息。在此处包含代码可能要花很长时间,而且对Google来说很容易。

https://www.c-sharpcorner.com/UploadFile/raj1979/consume-Asp-Net-web-api-using-httpclient-in-wpf/

在更严重的应用程序中,您希望考虑具有一些抽象和层次,但最终,您将通过http客户端通过webAPI将json解析为对象并将其绑定。 IQueryable不是免费的,需要实现,除非您考虑使用OData。我将更容易实现应用程序所需的事情并显式公开这些路由。

不知道这是否能满足您的要求,但可能有助于重新考虑这一概念。 如果我弄错了,请考虑更准确地更新您的问题。

HTH

答案 1 :(得分:0)

我发现我的问题的解决方法是Remote.LINQ