You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现两表筛选后关联查询并将结果存入List<cusPod>?

如何正确实现指定行数据关联并存入泛型列表?

你的需求与现有代码

你需要从Customer和Product表中跳过首行,各取接下来的2条数据,关联后存入List<cusPod>。你写的代码思路是对的,但有几个关键细节需要调整,先看下你的原代码:

List<Customer> customers = db.Database.SqlQuery<Customer>("SELECT * FROM Customers ORDER BY CustomerId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY").ToList();
List<Product> products = db.Database.SqlQuery<Product>("SELECT * FROM Products ORDER BY ProductId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY").ToList();
var listSas = from p in products 
              join c in customers on p.ProductId equals c.CustomerId 
              select new { 
                  ProductId = p.ProductId, 
                  ProductName = p.ProductName, 
                  DateStart = p.DateStart, 
                  DateEnd = p.DateEnd, 
                  DateRegister = p.DateRegister, 
                  PriceCustomer = p.PriceCustomer, 
                  CheckPay = p.CheckPay, 
                  CustomerId = p.CustomerId, 
                  FIO = c.FIO, 
                  Email = c.Email, 
                  PhoneNumber = c.PhoneNumber 
              };
SidebarController.cusPod = listSas.ToList();

核心问题与修正方案

1. 关联条件大概率写反了

通常业务逻辑里,是Product表的CustomerId字段关联Customer表的CustomerId,而你写的on p.ProductId equals c.CustomerId逻辑上不太合理,除非你的业务有特殊设计。正确的关联条件应该是:

on p.CustomerId equals c.CustomerId

2. 匿名类型无法直接转成List<cusPod>

你用匿名类型select new {...}生成的集合,不能直接赋值给List<cusPod>,必须直接实例化cusPod类:

select new cusPod { 
    ProductId = p.ProductId, 
    ProductName = p.ProductName, 
    DateStart = p.DateStart, 
    DateEnd = p.DateEnd, 
    DateRegister = p.DateRegister, 
    PriceCustomer = p.PriceCustomer, 
    CheckPay = p.CheckPay, 
    CustomerId = p.CustomerId, 
    FIO = c.FIO, 
    Email = c.Email, 
    PhoneNumber = c.PhoneNumber 
}

3. 可选:在数据库层面完成筛选+关联(更高效)

如果你想减少内存中的集合操作,可以直接在SQL里完成筛选和关联,一次性拿到目标数据:

var listSas = db.Database.SqlQuery<cusPod>(@"
    SELECT 
        p.ProductId, 
        p.ProductName, 
        p.DateStart, 
        p.DateEnd, 
        p.DateRegister, 
        p.PriceCustomer, 
        p.CheckPay, 
        p.CustomerId, 
        c.FIO, 
        c.Email, 
        c.PhoneNumber 
    FROM (
        SELECT * FROM Products ORDER BY ProductId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY
    ) p
    JOIN (
        SELECT * FROM Customers ORDER BY CustomerId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY
    ) c ON p.CustomerId = c.CustomerId
").ToList();

SidebarController.cusPod = listSas;

这种方式更适合数据量较大的场景,减少应用端的内存消耗。

4. 确保cusPod类的属性匹配

要保证cusPod的属性名称和查询返回的列名完全一致(或者用[Column]特性做映射),比如你的cusPod类应该是这样的:

public class cusPod
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime DateEnd { get; set; }
    public DateTime DateRegister { get; set; }
    public decimal PriceCustomer { get; set; }
    public bool CheckPay { get; set; }
    public int CustomerId { get; set; }
    public string FIO { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}

5. 数据库兼容性提醒

OFFSET/FETCH是SQL Server 2012+的语法,如果你的数据库是MySQL,需要改成LIMIT写法:

-- MySQL 跳过首行取2条
SELECT * FROM Customers ORDER BY CustomerId LIMIT 1, 2

修正后的完整代码(内存关联版)

// 获取跳过首行的2条客户数据
List<Customer> customers = db.Database.SqlQuery<Customer>(
    "SELECT * FROM Customers ORDER BY CustomerId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY"
).ToList();

// 获取跳过首行的2条产品数据
List<Product> products = db.Database.SqlQuery<Product>(
    "SELECT * FROM Products ORDER BY ProductId OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY"
).ToList();

// 关联并投影到cusPod类型
var listSas = from p in products 
              join c in customers on p.CustomerId equals c.CustomerId
              select new cusPod { 
                  ProductId = p.ProductId, 
                  ProductName = p.ProductName, 
                  DateStart = p.DateStart, 
                  DateEnd = p.DateEnd, 
                  DateRegister = p.DateRegister, 
                  PriceCustomer = p.PriceCustomer, 
                  CheckPay = p.CheckPay, 
                  CustomerId = p.CustomerId, 
                  FIO = c.FIO, 
                  Email = c.Email, 
                  PhoneNumber = c.PhoneNumber 
              };

// 赋值到静态列表
SidebarController.cusPod = listSas.ToList();

内容的提问来源于stack exchange,提问作者3uk Mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:19