将联接添加到现有 LINQ 查询

本文关键字:LINQ 查询 添加 | 更新日期: 2023-09-27 18:34:24

我得到了这个堆栈溢出问题的帮助。

现在我正在构建查询,需要向其他表添加联接以引入名称和描述等。

我的查询是这样的:

using (var ctx = new myEntities())
            {
                var pc = ctx.tblPostcodes.Where(z => z.Postcode == postcodeOutward)
                        .Select(x => new {postcodeId = x.PostcodeID}).Single();
                int pcId = pc.postcodeId;
                var q = ctx.tblPrices.OrderByDescending(x => x.Cost)
                .Where(c => c.PostcodeID == pcId)
                .Where(s => s.ItemID < 18)
                .GroupBy(x => x.ItemID)
                .Select(g => new { g, count = g.Count() })
                .ToList()
                .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new { j.ItemID, j.Cost, j.SupplierID }));
                foreach (var i in q)
                {
                    sb.AppendFormat("ItemId = {0}, Cost = {1}, SupplierId = {2}<hr/>", i.ItemID,  i.Cost, i.SupplierID);
                }
            }

我正在尝试添加以下连接:

.Join(ctx.tblItems, it => it.ItemID, s => s.ItemID, (it, s) => new { it, s })

但它会导致不明确的调用错误。有什么想法吗?我将需要再添加两个内部连接。我希望做对一个,另外两个会很容易(希望如此)。

将联接添加到现有 LINQ 查询

如果先使用数据库,EF 会为你生成导航属性,因此你不必加入。

如果希望能够在查询之外获取此信息,请使用 .包含("导航属性名称")命令以添加"联接",这将导致将相应的对象或对象列表添加到查询结果中。

 var q = ctx.tblPrices.Include("tblItems").OrderByDescending(x => x.Cost)

最好查看 EF 模型以了解该属性的名称...

试试这个,我不知道它是否会在第一次尝试中起作用,但这是一个很好的起点!

using (var ctx = new myEntities())
{
    var pc = ctx.tblPostcodes
        .First(x => x.Postcode == postcodeOutward)
        .Select(x => new { postcodeId = x.PostcodeID });
    var prices = ctx.tblPrices
        .Where(x => x.PostcodeID == pc.postcodeId)
        .OrderByDescending(x => x.Cost)
        .ToList();
    var items = ctx.tblItems
        .Where(y => y.ItemID < 18)
        .GroupBy(y => y.ItemID)
        .Select(y => new { y, count = y.Count() })
        .ToList();
    // Join
    var q = prices
        .Join(items,
            pr => pr.ItemID,
            it => it.ItemID,
            (pr, it) => new
            {
                pr.ItemID,
                pr.Cost,
                pr.SupplierID
            })
        .ToList();
    q.Select(x => sb.AppendFormat("ItemId = {0}, Cost = {1}, SupplierId = {2}<hr/>", 
        x.ItemID, x.Cost, x.SupplierID));
}