【问题标题】:InnerJoin with Where Expression trouble与Where表达式麻烦的内部连接
【发布时间】:2009-11-17 14:44:49
【问题描述】:

我正在使用 Subsonic 2.1,我需要进行内部连接并使用 where 表达式,但我不断收到错误消息:

Must declare the scalar variable "@Partner"

这是我的代码:

Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
 .From("Customer").InnerJoin("Partner")
     .Where("Partner.PartnerID").IsEqualTo("Customer.PartnerID")
 .WhereExpression("FirstName").Like("%" & SearchTerm & "%")
     .Or("LastName").Like("%" & SearchTerm & "%")
     .Or("EmailAddress").Like("%" & SearchTerm & "%")
 .CloseExpression()
 .ExecuteDataSet()

我已经尝试用 10 种不同的方式重新安排这件事,但似乎无法做到正确。

【问题讨论】:

    标签: subsonic subsonic2.2 subsonic-active-record subsonic-select


    【解决方案1】:

    您是否有理由在 where 子句中而不是在连接本身中指定连接条件?

    我重写了您的查询以利用强类型列名,您应该尽可能地这样做,因为您可以在编译时而不是运行时发现问题。此外,使用 .ContainsString() 代替串联的 gobblydegook 以获得更好的可读性。

    Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
     .From(Customer.Schema)
      .InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)
      .Where(Customer.FirstNameColumn).ContainsString(SearchTerm)
      .Or(Customer.LastNameColumn).ContainsString(SearchTerm)
      .Or(Customer.EmailAddressColumn).ContainsString(SearchTerm)
     .ExecuteDataSet()
    

    或者使用您的原始代码,只需使用内部连接的四个字符串重载并在那里指定列。我认为当你真的不需要时尝试在 where 子句中进行连接,你会被绊倒。

    Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
     .From("Customer")
     .InnerJoin("Partner","PartnerID","Customer","PartnerID")
     .Where("FirstName").Like("%" & SearchTerm & "%")
         .Or("LastName").Like("%" & SearchTerm & "%")
         .Or("EmailAddress").Like("%" & SearchTerm & "%")
     .ExecuteDataSet()
    

    【讨论】:

      【解决方案2】:

      .InnerJoin("Partner p")..Where("p.PartnerID") ?

      我以前从未见过这个,所以我真的只是在猜测。所以,如果我只是愚蠢的话,请忽略我:p

      【讨论】:

        【解决方案3】:

        有两种方法可以使用亚音速进行内部连接。第一种方法是指定要链接的列,例如:

        .InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)
        

        如果您的 SubSonic 模型中已经设置了关系,您可以只指定表,而无需指定列。看起来这就是您想要做的,但您的语法不太正确。您必须使用泛型,如下所示:

        .InnerJoin<Partner>()
        

        第二种方式更可取,因为它更具可读性。但是,它仅在尝试加入您在 From() 函数中指定的表时才有效。在这种情况下它应该对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-25
          • 2011-03-31
          • 1970-01-01
          • 2017-06-24
          相关资源
          最近更新 更多