多个表中具有相同名称的列导致SubSonic Select出现问题

时间:2009-06-30 05:15:35

标签: c# database subsonic sql subsonic-select

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

现在问题:我有3个表,我只需从中选择4列。我正在使用InnerJoin并且它工作得很好。当我添加Where to this Select时,问题就开始了。我在两个表中有一个名为“Name”的列。如果我只添加

.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%");

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

以下查询是否有效,我假设您使用的是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%");

答案 2 :(得分:0)

我从未使用过它,

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

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