C# 如何简化“我的查询”并使用其他命令?

C# 如何简化“我的查询”并使用其他命令?,c#,postgresql,C#,Postgresql,如何简化“我的查询”并使用其他命令?我依次看三张桌子。这似乎很难。我请求帮助 result = "<p>" + (++num) + ")" + node.Text + "</p>"; foreach (var itm in _dbContext.ERIPKEY.Where(k => k.PKeyName == node.Text).ToArray()) { foreach (var itmk in _dbContext.ERIKEY.Where(s =>

如何简化“我的查询”并使用其他命令?我依次看三张桌子。这似乎很难。我请求帮助

result = "<p>" + (++num) + ")" + node.Text + "</p>";
foreach (var itm in _dbContext.ERIPKEY.Where(k => k.PKeyName == node.Text).ToArray())
{
    foreach (var itmk in _dbContext.ERIKEY.Where(s => s.PKey == itm.PKey).ToArray())
    {
        foreach (var item in _dbContext.ERIPKEYMOUNTING.Where(t => t.MIndex == itmk.MIndex).ToArray())
        {
            result += "<p> - " + item.Note + "</p>";
        }
    }
}
result=“”+(++num)+“+node.Text+”

”; foreach(在_dbContext.ERIPKEY.Where(k=>k.PKeyName==node.Text.ToArray()中使用var itm) { foreach(在_dbContext.ERIKEY.Where(s=>s.PKey==itm.PKey.ToArray()中的变量itmk) { foreach(_dbContext.ERIPKEYMOUNTING.Where(t=>t.MIndex==itmk.MIndex.ToArray()中的var项) { 结果+=“-”+项。注+“

”; } } }
LinqPad中的Linq连接解决方案。我使用Northwind数据库并加入4个表:
客户
订单
订单详细信息
产品
。我使用的是SQLServerExpress,所以我假设您有适合PostgreSQL的Linq驱动程序

var _dbContext = new UserQuery(Connection); // LinqPad only, change to your dbcontext constructor
var query =
    from customer in _dbContext.Customers
    join order in _dbContext.Orders on customer.CustomerID equals order.CustomerID
    join orderDetail in _dbContext.OrderDetails on order.OrderID equals orderDetail.OrderID
    join product in _dbContext.Products on orderDetail.ProductID equals product.ProductID
    where customer.ContactName == "Peter Franken"
    select new
    {
        CustomerName = customer.ContactName,
        OrderDate = order.OrderDate,
        ProductName = product.ProductName,
        Subtotal = orderDetail.UnitPrice * orderDetail.Quantity
    };

foreach(var q in query)
    Console.WriteLine("{0} {1} {2} {3}", q.CustomerName, q.OrderDate, q.ProductName, q.Subtotal);
导致LinqPad

从LinqPad中的该查询生成的SQL命令:

-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'Peter Franken'
-- EndRegion
SELECT [t0].[ContactName] AS [CustomerName], [t1].[OrderDate], [t3].[ProductName], [t2].[UnitPrice] * (CONVERT(Decimal(29,4),[t2].[Quantity])) AS [Subtotal]
FROM [Customers] AS [t0]
INNER JOIN [Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
INNER JOIN [Order Details] AS [t2] ON [t1].[OrderID] = [t2].[OrderID]
INNER JOIN [Products] AS [t3] ON [t2].[ProductID] = [t3].[ProductID]
WHERE [t0].[ContactName] = @p0

最后,如果查询结果很大,您可能希望使用
StringBuilder
来连接字符串。

FYI可以消除所有
ToArray()
调用。
foreach
循环在实现
IEnumerable
的东西上运行,因此您可以排除物化逻辑(例如
ToArray()
调用),只需迭代
Where()
的结果,使用Linq join而不是嵌套循环。我的代码可以工作,但我正在学习,我想纠正我的错误。在我看来,我写得不好。我想看看如何在Linqa上重写它的最佳选项您是否尝试使用字符串连接创建HTML?通过使用来避免自己几天的挫折。