【问题标题】:Column with same name in multiple tables causing problem in SubSonic Select多个表中具有相同名称的列导致 SubSonic Select 出现问题
【发布时间】:2009-06-30 05:15:34
【问题描述】:

还有其他类似的问题(我见过至少 2 个),但我无法使用它们解决这个问题。

现在的问题是:我有 3 个表,我只需要从中选择 4 列。我正在使用 InnerJoin,它运行良好。当我向此选择添加位置时,问题就开始了。我在两个表中有一个名为“名称”的列。如果我简单地添加

.Where("Name").Like("A%")

上面写着“......列名不明确......”

如果我使用完全限定的列名(表前缀为列名),它说必须声明参数@TABLE_NAME

  SqlQuery sq = new Select(Tables.TableOne + "." + TableOne.Columns.MemberId + 
  " AS MemberId",
  Tables.TableTwo + "." + TableTwo.Columns.Name + " AS MemberName",
  Tables.TableOne + "." + TableOne.Columns.ExpiryOn + " AS MembershipExpiresOn",
  Tables.TableFour + "." + TableFour.Columns.Name + " AS Country")
  .From(DAL.Tables.TableOne)
  .InnerJoin(Tables.TableTwo)
  .InnerJoin(Tables.TableThree)
  .InnerJoin(Tables.TableFour, TableFour.Columns.CountryCode,
  Tables.TableThree, TableThree.Columns.CountryOfBirth).
  sq.Where(Tables.TableTwo + "." + TableTwo.Columns.Name).Like("A%");

我也尝试过传递硬编码的字符串,但没有任何效果!

【问题讨论】:

    标签: c# database subsonic sql subsonic-select


    【解决方案1】:

    如果您将列对象传递给 Where 语句,SubSonic 将使用它的完全限定名称而不是构建字符串。您可以在对象上找到作为静态属性的列,因此在这种情况下,如果您有一个名为“TableOne”的对象,您可以使用“TableOne.NameColumn”并将其传递给 Where():

    ...
    sq.Where(TableTwo.NameColumn).Like("A%");
    

    【讨论】:

    • 感谢罗布的回答。首先它不是 TableTwo.NameColumn 而是 TableTwo.Columns.NameColumn。其次,当我通过 sq.Where(TableTwo.NameColumn) 它在生成的 SQL 脚本中使用 TableFour.Name 。它工作但错误:( [我已移至 SubSonic 2.2]
    【解决方案2】:

    以下查询是否有效,我假设您使用的是 2.2:

    SqlQuery sq = new Select(TableOne.Columns.MemberId + " AS MemberId",
        TableTwo.Columns.Name + " AS MemberName",
        TableOne.Columns.ExpiryOn + " AS MembershipExpiresOn",
        TableFour.Columns.Name + " AS Country")
      .From(TableOne.Schema)
      .InnerJoin(TableTwo.Schema)
      .InnerJoin(TableThree.Schema)
      .InnerJoin(TableFour.Schema)
      .Where(TableTwo.Columns.Name).Like("A%");
    

    【讨论】:

    • 是的,正如 Rob Conery 在此站点上的某个地方发布的那样,第二件事可以与 SubSonic 2.2 一起使用,但它无法正常工作。使用列别名也不起作用,这很奇怪
    • @Adam: .Where("MemberName").Like("A%") 可能不起作用,因为 SQL Select 不能在 where 子句中使用别名。这在 sql 中不起作用:“SELECT sum * quantity as result WHERE result > 5”。您必须改写“SELECT sum * quantity as result HAVING result > 5”或“SELECT sum * quantity as result WHERE sum * quantity > 5”。
    • @SchlaWiener:谢谢,我总是忘记这一点,直到 sql 提醒我。
    【解决方案3】:

    我没用过,

    但您是否尝试将最后一行更改为:

    sq.WhereExpression(Tables.TableTwo + "." + TableTwo.Columns.Name + " LIKE 'A%');
    

    【讨论】:

    • WhereExpression 用于组合多个条件,在这种情况下不会起任何作用。
    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2017-02-20
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多