这个问题是关于Linq2db的使用,而不是关于 LinqToSQL。Linq2db 是一种替代 ORM,它支持 Postgresql 或 SQLite 等其他数据库类型。Linq2db 针对不消耗太多资源进行了优化,因此尝试直接访问db.Activities.First().Customer.Name
,总是会抛出异常,因为它不会加载 Costomer 的值。
例如,如果我们使用以下代码查询罗斯文数据库的客户,
using (var db = new NorthwindDB())
{
var q = from c in db.Customers
select c;
}
它将生成如下 SQL 查询:
{-- NorthwindDB SqlServer.2008
SELECT
[t1].[CustomerID],
[t1].[CompanyName],
[t1].[ContactName],
[t1].[ContactTitle],
[t1].[Address],
[t1].[City],
[t1].[Region],
[t1].[PostalCode],
[t1].[Country],
[t1].[Phone],
[t1].[Fax]
FROM
[dbo].[Customers] [t1]
}
尽管实体与Customer
实体具有一对多的关系,但Order
它们不会加载这些值。对于我们想要获取他们的客户订单的情况,我建议使用未知类型(或简单类)作为以下查询。
using (var db = new NorthwindDB())
{
var q = from c in db.Customers
select new
{
c.CompanyName,
EmployeeName = c.Orders.First().Employee.FirstName
};
}
它将生成如下 SQL 查询:
{-- NorthwindDB SqlServer.2008
SELECT
[t4].[CompanyName],
[t3].[FirstName] as [FirstName1],
[t3].[c1] as [c11]
FROM
[dbo].[Customers] [t4]
OUTER APPLY (
SELECT TOP (1)
[t1].[FirstName],
1 as [c1]
FROM
[dbo].[Orders] [t2]
LEFT JOIN [dbo].[Employees] [t1] ON [t2].[EmployeeID] = [t1].[EmployeeID]
WHERE
[t4].[CustomerID] = [t2].[CustomerID]
) [t3]
}