面试题答案
一键面试GraphQL查询
query GetOrdersInTimeRangeAndTotalPriceGreaterThan($startTime: DateTime, $endTime: DateTime, $minTotalPrice: Float) {
orders(startTime: $startTime, endTime: $endTime, minTotalPrice: $minTotalPrice) {
orderNumber
orderTime
orderItems {
productName
price
quantity
}
}
}
C#后端代码解析
- 定义数据模型
public class Order
{
public string OrderNumber { get; set; }
public DateTime OrderTime { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public string ProductName { get; set; }
public float Price { get; set; }
public int Quantity { get; set; }
}
- GraphQL解析逻辑
using GraphQL.Types;
using System;
using System.Collections.Generic;
using System.Linq;
public class OrderQuery : ObjectGraphType
{
public OrderQuery()
{
Field<ListGraphType<OrderType>>(
"orders",
arguments: new QueryArguments(
new QueryArgument<NonNullGraphType<DateTimeGraphType>> { Name = "startTime" },
new QueryArgument<NonNullGraphType<DateTimeGraphType>> { Name = "endTime" },
new QueryArgument<NonNullGraphType<FloatGraphType>> { Name = "minTotalPrice" }
),
resolve: context =>
{
var startTime = context.GetArgument<DateTime>("startTime");
var endTime = context.GetArgument<DateTime>("endTime");
var minTotalPrice = context.GetArgument<float>("minTotalPrice");
// 假设这里从数据库获取所有订单数据
List<Order> allOrders = GetAllOrdersFromDatabase();
return allOrders.Where(order =>
order.OrderTime >= startTime && order.OrderTime <= endTime &&
order.OrderItems.Sum(item => item.Price * item.Quantity) > minTotalPrice
).ToList();
}
);
}
private List<Order> GetAllOrdersFromDatabase()
{
// 实际实现从数据库获取订单数据
return new List<Order>();
}
}
public class OrderType : ObjectGraphType<Order>
{
public OrderType()
{
Field(x => x.OrderNumber);
Field(x => x.OrderTime);
Field<ListGraphType<OrderItemType>>("orderItems", resolve: context => context.Source.OrderItems);
}
}
public class OrderItemType : ObjectGraphType<OrderItem>
{
public OrderItemType()
{
Field(x => x.ProductName);
Field(x => x.Price);
Field(x => x.Quantity);
}
}
- 配置GraphQL服务
在
Startup.cs
中配置GraphQL服务:
using GraphQL;
using GraphQL.Http;
using GraphQL.Types;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ISchema, OrderSchema>();
services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
services.AddSingleton<IDocumentWriter, DocumentWriter>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseGraphQL<ISchema>();
app.UseGraphQLPlayground();
}
}
public class OrderSchema : Schema
{
public OrderSchema(IServiceProvider serviceProvider) : base(serviceProvider)
{
Query = serviceProvider.GetRequiredService<OrderQuery>();
}
}
这样就完成了GraphQL查询及C#后端代码对复杂查询的解析并返回相应数据。