CodeGeex 可基于自然语言生成符合 .NET 6+ 规范的 IQueryable 查询链:需本地部署 codegeex2-6b-int4 模型并启动 llama-server 服务,构造含实体结构、目标与约束的 Prompt,调用 API 获取纯 LINQ 表达式,注入后验证编译及 SQL 翻译正确性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在 C# 开发中,面对多表关联、动态筛选、分页聚合等场景时,手动拼写嵌套 LINQ 表达式容易出错、调试耗时长,且难以兼顾可读性与性能;CodeGeex 作为支持本地部署的代码生成模型,能基于自然语言描述直接产出符合 .NET 6+ 规范的 IQueryable
准备 CodeGeex 本地运行环境
从 Hugging Face 下载 codegeex2-6b-int4 量化模型权重,解压后放入项目根目录 ./models/codegeex2-6b-int4/;确保已安装 llama.cpp v0.28+ 并编译为可执行文件 llama-server。
启动服务:llama-server -m ./models/codegeex2-6b-int4/ggml-model-q4_0.bin -c 2048 --port 8080 --host 127.0.0.1 --threads 8。
这一步必须完成,否则后续所有请求都会返回连接拒绝错误。【端口 8080 不可被其他进程占用】
定义查询意图并构造 Prompt
在 C# 中新建字符串变量 prompt,内容需包含三要素:上下文(实体类结构)、目标(要查什么)、约束(如不能用 foreach、必须返回 IQueryable<CustomerOrderSummary>)。
示例 prompt:
"你是一名资深 C# 开发者。当前有 Customer、Order、Product 三个实体,含导航属性。请生成一个 IQueryable<CustomerOrderSummary> 表达式:统计每个客户近30天内订单总金额、下单次数、购买过的不同商品种类数;排除已取消订单;结果按总金额降序排列;只取前 50 条。"
注意:Prompt 中必须显式写出实体名和目标类型名,否则 CodeGeex 可能返回 List<T> 或匿名类型,导致编译失败。
调用 API 获取 LINQ 表达式文本
使用 HttpClient 发起 POST 请求到 http://127.0.0.1:8080/completion,Body 为 JSON:
{"prompt":"[INST]>你只输出可直接粘贴进 C# 文件的 LINQ 表达式代码,不加解释、不加注释、不加 markdown 格式。>\n" + prompt + "[/INST]","temperature":0.1,"max_tokens":1024}。
接收响应后,从 response["choices"][0]["text"] 提取纯文本内容,该内容应以“context.Customers”或“db.Customers”开头,结尾为分号。
若返回内容含中文注释、```csharp 包裹、或出现 var query = ... 形式,请丢弃该结果并重试——这些不符合 IQueryable 直接赋值要求。
注入表达式并验证编译通过
将提取出的表达式字符串粘贴到方法体内,替换掉原有查询逻辑,例如:
var result = 【context.Customers.Where(c => c.CreatedAt >= DateTime.Now.AddDays(-30)).SelectMany(c => c.Orders.Where(o => o.Status != "Cancelled").Select(o => new { c.Id, c.Name, o.TotalAmount, ProductCount = o.Items.Select(i => i.ProductId).Distinct().Count() })).GroupBy(x => new { x.Id, x.Name }).Select(g => new CustomerOrderSummary { CustomerId = g.Key.Id, CustomerName = g.Key.Name, TotalRevenue = g.Sum(x => x.TotalAmount), OrderCount = g.Count(), UniqueProductCount = g.Sum(x => x.ProductCount) }).OrderByDescending(x => x.TotalRevenue).Take(50)】;
光标置于 result 变量上,按 Ctrl+. 快速修复命名空间引用,确保 System.Linq、System.Collections.Generic 已导入。
此时若出现 CS0266 类型转换错误,说明 CodeGeex 返回了非泛型 IQueryable,需检查 prompt 是否遗漏了目标类型 IQueryable<CustomerOrderSummary> 的声明。
运行时验证查询行为
第一步:在 DbContext 派生类中启用 EF Core 日志输出,配置 UseLoggerFactory 委托,将日志级别设为 Debug。
第二步:执行 result.ToList(),观察控制台输出的 SQL 是否含预期的 LEFT JOIN、WHERE 时间过滤、GROUP BY 分组字段及 ORDER BY 排序子句。
第三步:对比原始手写查询与生成查询的执行计划,确认未出现 N+1 查询或客户端评估警告(如 warning CS8794)。
只要 SQL 输出中没有 “@__p_0” 以外的参数占位符,且 GROUP BY 字段与 SELECT 字段完全匹配,即可确认表达式已被完整翻译为服务端 SQL。


















