没有where子句的Simple.Data连接,包括任何主表列

时间:2012-11-29 21:44:02

标签: simple.data

我正在使用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行。谢谢!

2 个答案:

答案 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的示例。到达那里时单击显式连接。