Linq решение для соединения в LinqPad.Я использую базу данных Northwind и объединяю 4 таблицы: Customers
, Orders
, OrderDetails
и Products
.Я использую SQL Server Express, поэтому я предполагаю, что у вас есть подходящий драйвер Linq для PostgreSQL.
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
Сгенерированная команда SQL из этого запроса в LinqPad:
-- 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
для объединения строк, если результат запроса большой.