我正在使用Simple.Data并且一直在尝试找到一个示例,它允许我从WHERE子句中的唯一条件进行连接,来自连接表。我见过的所有示例总是在WHERE中包含的主表中至少有一列。例如,以下数据:
private void TestSetup()
{
var adapter = new InMemoryAdapter();
adapter.SetKeyColumn("Events", "Id");
adapter.SetAutoIncrementColumn("Events", "Id");
adapter.SetKeyColumn("Doors", "Id");
adapter.SetAutoIncrementColumn("Doors", "Id");
adapter.Join.Master("Events", "Id").Detail("Doors", "EventId");
Database.UseMockAdapter(adapter);
db.Events.Insert(Id: 1, Code: "CodeMash2013", Name: "CodeMash 2013");
db.Events.Insert(Id: 2, Code: "SomewhereElse", Name: "Some Other Conf");
db.Doors.Insert(Id: 1, Code: "F7E08AC9-5E75-417D-A7AA-60E88B5B99AD", EventID: 1);
db.Doors.Insert(Id: 2, Code: "0631C802-2748-4C63-A6D9-CE8C803002EB", EventID: 1);
db.Doors.Insert(Id: 3, Code: "281ED88F-677D-49B9-84FA-4FAE022BBC73", EventID: 1);
db.Doors.Insert(Id: 4, Code: "9DF7E964-1ECE-42E3-8211-1F2BF7054A0D", EventID: 2);
db.Doors.Insert(Id: 5, Code: "9418123D-312A-4E8C-8807-59F0A63F43B9", EventID: 2);
}
我试图弄清楚我需要在Simple.Data中使用的语法来获得类似于这个T-SQL的东西:
SELECT d.Code FROM Doors AS d INNER JOIN Events AS e ON d.EventID = e.Id WHERE e.Code = @EventCode
当我传入" CodeMash2013"的事件代码时,最终结果应该只是EventId 1的三个Door行。谢谢!
答案 0 :(得分:3)
首先,一般性观点:既然你已经对加入的事件表有了标准,那么LEFT OUTER是多余的;只返回具有匹配事件代码的行,这仅表示从Doors到Events的连接成功的那些行。
如果您在数据库中设置了参照完整性,并且具有从Doors到Events的外键关系,则Simple.Data可以自动处理联接。考虑到这一点,这个代码将适用于InMemoryAdapter和SQL Server:
List<dynamic> actual = db.Doors.FindAll(db.Doors.Events.Code == "CodeMash2013")
.Select(db.Doors.Id, db.Events.Name)
.ToList();
Assert.AreEqual(3, actual.Count);
如果您没有设置参照完整性,那么您应该,但如果由于某种原因不能,那么以下内容将适用于SQL Server,但会触发我刚刚修复的InMemoryAdapter中的错误但还没有发布:
dynamic eventAlias;
List<dynamic> actual = db.Doors.All()
.Join(db.Events, out eventAlias)
.On(db.Doors.EventID == eventAlias.Id)
.Select(db.Doors.Id, db.Events.Name)
.Where(eventAlias.Code == eventCode)
.ToList();
Assert.AreEqual(3, actual.Count);
答案 1 :(得分:0)
更新:此答案适用于使用Simple.Data SQL Server提供程序,而不是InMemoryAdapter
您可以使用以下内容:
db.Doors.All()
.Select(
db.Doors.Code)
.LeftJoin(db.Events).On(db.Doors.EventID == db.Events.Id)
.Where(db.Events.Code == eventCode);
您可能需要在使用LeftJoin和OuterJoin之间进行试验,具体取决于您的提供商。例如,如果您正在使用ADO提供程序,则这两个函数都生成LEFT JOIN语句,因为LEFT JOIN和LEFT OUTER JOIN在t-sql中是同义词。
如果由于某种原因需要使用别名,则语法略有不同。
dynamic EventAlias;
db.Doors.All()
.LeftJoin(db.Events.As"e", out EventAlias).On(db.Doors.EventID == db.EventAlias.Id)
.Select(
db.Doors.Code)
.Where(db.EventAlias.Code == eventCode);
where子句必须包含主键表中的字段。您可以找到更多联接here on the Simple.Data doc site的示例。到达那里时单击显式连接。