C# Linq和存储库模式——不了解如何应用连接方法
我知道这很简单,但我就是想不起来。给出一个类似于以下内容的查询:C# Linq和存储库模式——不了解如何应用连接方法,c#,linq,C#,Linq,我知道这很简单,但我就是想不起来。给出一个类似于以下内容的查询: SELECT * FROM Client LEFT JOIN DriverClient ON DriverClient.ClientID = Client.ClientID WHERE Client.FullName LIKE '%Tooley%' AND (DriverClient.DriverID IS NULL OR DriverClient.DriverID <> 1) 对于一个存储库模式,我将如何在Lin
SELECT * FROM Client
LEFT JOIN DriverClient ON DriverClient.ClientID = Client.ClientID
WHERE Client.FullName LIKE '%Tooley%'
AND (DriverClient.DriverID IS NULL OR DriverClient.DriverID <> 1)
对于一个存储库模式,我将如何在Linq中实现类似于此的东西
我弄明白了,是DriverClient上的过滤器。DriverID我搞不懂。这显然涉及IEnumerable.Join,但我想不起它的语法,我也无法用谷歌搜索出一个好的示例,每个人似乎都使用Linq查询语法,或者使用预填充集合的示例,而不是IQueryable。此链接可能很有用,它描述了如何使用预填充集合进行左连接,但对于IQueryable,情况是一样的
-这里有很多有用的例子试试看:
var Client = new[] { new { ClientID = 1, FullName = "Name1" }, new { ClientID = 2, FullName = "Name2_Tooley_3242343" } };
var DriverClient = new[] { new { ClientID = 2, DriverID = 20 }, new { ClientID = 3, DriverID = 30 } };
var result =
from client in Client
join driver in DriverClient on client.ClientID equals driver.ClientID into ClientDriver
from clientDriver in ClientDriver.DefaultIfEmpty()
where client.FullName.Contains("Tooley") && (clientDriver == null || clientDriver.DriverID != 1)
select client;
更新
虽然LINQ中有连接构造,但通常不需要它。在面向对象编程中,使用关系数据库中的联接查询的关系以单个对象或集合的属性表示。看起来您应该在映射中使用DriverClient.Clients或类似的东西,并使用它来代替连接。在不知道数据库结构的情况下,有些是猜测 看起来DriverClient是一个简单的链接表,对吗?DriverID和ClientID列,仅用于将驱动程序链接到客户端?假设这意味着你有一对多的关系,一个司机有很多客户;看起来很合理,你可能在寻找这样的东西: var result=DB.Clients .Wherec=>c.FullName.ContainsTooley &&c.DriverID==null | | c.DriverID!=1.
一般来说,LINQ会试图隐藏连接和事物的细节。相反,您可以获得导航属性之类的内容。这里的关键是如何处理上下文。如果每个客户机在您的存储库中管理自己的上下文,您将无法跨上下文加入。然而如果所有存储库通过DI使用相同的底层上下文,那么只要您将存储库中的对象公开为IQueryable而不是IEnumerable/IList/etc,您就应该能够使用查询或lambda语法将它们连接起来。请显示您的代码。我在这里真正寻找的是使用该方法实现这一点的方法扩展语法而不是查询语法。由于此项目中使用的存储库模式,查询语法将无法正常工作。lamont这没有任何意义,因为查询语法等同于扩展方法语法。
var result2 = Client
.GroupJoin(DriverClient, client => client.ClientID, driver => driver.ClientID, (client, drivers) => new { client, drivers })
.Where(clientDrivers => clientDrivers.client.FullName.Contains("Tooley") && clientDrivers.drivers.Count(driver => driver.DriverID != 1) > 0);