MST
星途 面试题库

面试题:C#中GraphQL的复杂查询和数据解析

在一个C#的GraphQL项目里,有一个复杂对象类型,例如订单,订单包含订单号、下单时间、订单项列表(订单项又包含商品名称、价格、数量)。现在需要编写一个GraphQL查询,获取某个时间段内的所有订单,并且订单中的订单项总价大于一定金额,同时展示如何在C#后端代码中解析这个复杂查询并返回相应数据。
39.0万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

GraphQL查询

query GetOrdersInTimeRangeAndTotalPriceGreaterThan($startTime: DateTime, $endTime: DateTime, $minTotalPrice: Float) {
  orders(startTime: $startTime, endTime: $endTime, minTotalPrice: $minTotalPrice) {
    orderNumber
    orderTime
    orderItems {
      productName
      price
      quantity
    }
  }
}

C#后端代码解析

  1. 定义数据模型
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; }
}
  1. 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);
    }
}
  1. 配置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#后端代码对复杂查询的解析并返回相应数据。