Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Subsonic 亚音速中的内连接问题_Subsonic - Fatal编程技术网

Subsonic 亚音速中的内连接问题

Subsonic 亚音速中的内连接问题,subsonic,Subsonic,下面是SQL查询 Table:Account AccountID|AccountName|AccountTypeID|IsActive 17 |aaaa |5 |1 18 |bbbb |5 |1 19 |cccc |5 |1 Table:AccountAddress AddressID|AccountID|CityId 1734 |17

下面是SQL查询

Table:Account
AccountID|AccountName|AccountTypeID|IsActive
17       |aaaa       |5            |1
18       |bbbb       |5            |1
19       |cccc       |5            |1

Table:AccountAddress
AddressID|AccountID|CityId
1734     |17       |2721
1823     |18       |2721
1912     |19       |2722

Table: City
CityID|StateProvID|CityName
2721  |28         |ablinne
2728  |27         |aberdeen

Table: StateProv
StateProvID|CountryID|StateProvName
27         |1        |-
28         |2        |-

Table: Country
CountryID|RegionID|CountryName
27       |111     |Algena
28       |112     |Argentina

Table: RegionID
RegionID|RegionName
111     |Africa
112     |Asia
我想将上述查询转换为亚音速查询。。。所以我写了如下

select Account.AccountID,AccountName,CityName,StateProvName,CountryName,RegionName from Account 
join AccountAddress on AccountAddress.AccountID=Account.AccountID 
join City on City.CityID=AccountAddress.CityID
join StateProv on StateProv.StateProvID=City.StateProvID
join Country on Country.CountryID=StateProv.CountryID
join Region on Region.RegionID=Country.RegionID
where Account.AccountTypeID=5 
and Account.IsActive=1
and City.CityID=2721
DataSet accounts = new Select(
                    Account.Columns.AccountName,
                    City.Columns.CityName,
                    Country.Columns.CountryName,
                    Region.Columns.RegionName,
                    StateProv.Columns.StateProvName)
                    .From(Account.Schema)
                    .InnerJoin(AccountAddress.Schema)
                    .InnerJoin(City.Schema)
                    .InnerJoin(StateProv.Schema)
                    .InnerJoin(Country.Schema)
                    .InnerJoin(Region.Schema)
                    .Where(Account.Columns.AccountTypeID).IsEqualTo(accountTypeId)
                    .And(Account.Columns.IsActive).IsEqualTo(isActive)
                    .And(City.CityIDColumn).IsEqualTo(cityId)
                    .ExecuteDataSet();
它不工作,我收到错误“对象引用未设置为对象的实例” 请告诉我如何检索我喜欢的数据

我使用的是亚音速版本2.1,它生成的sql查询如下

select Account.AccountID,AccountName,CityName,StateProvName,CountryName,RegionName from Account 
join AccountAddress on AccountAddress.AccountID=Account.AccountID 
join City on City.CityID=AccountAddress.CityID
join StateProv on StateProv.StateProvID=City.StateProvID
join Country on Country.CountryID=StateProv.CountryID
join Region on Region.RegionID=Country.RegionID
where Account.AccountTypeID=5 
and Account.IsActive=1
and City.CityID=2721
DataSet accounts = new Select(
                    Account.Columns.AccountName,
                    City.Columns.CityName,
                    Country.Columns.CountryName,
                    Region.Columns.RegionName,
                    StateProv.Columns.StateProvName)
                    .From(Account.Schema)
                    .InnerJoin(AccountAddress.Schema)
                    .InnerJoin(City.Schema)
                    .InnerJoin(StateProv.Schema)
                    .InnerJoin(Country.Schema)
                    .InnerJoin(Region.Schema)
                    .Where(Account.Columns.AccountTypeID).IsEqualTo(accountTypeId)
                    .And(Account.Columns.IsActive).IsEqualTo(isActive)
                    .And(City.CityIDColumn).IsEqualTo(cityId)
                    .ExecuteDataSet();

将其分解为单独的部分,以便可以找出哪个对象为空

例如:

堆栈跟踪会有所帮助。 很奇怪

var q = new Select( 
                Account.Columns.AccountName, 
                City.Columns.CityName, 
                Country.Columns.CountryName, 
                Region.Columns.RegionName, 
                StateProv.Columns.StateProvName)
                .From(Account.Schema);
               q = q.InnerJoin(AccountAddress.Schema);
               q = q.InnerJoin(City.Schema) 
               q = q.InnerJoin(StateProv.Schema) 
               q = q.InnerJoin(Country.Schema) 
               q = q.InnerJoin(Region.Schema) 
               q = q.Where(Account.Columns.AccountTypeID).IsEqualTo(accountTypeId) 
               q = q.And(Account.Columns.IsActive).IsEqualTo(isActive) 
               q = q.And(AccountAddress.CityIDColumn).IsEqualTo(cityId) 
               DataSet accounts = q.ExecuteDataSet(); 
抛出异常

您的解决方法:

q = q.And(AccountAddress.CityIDColumn).IsEqualTo(cityId)
不起作用,因为City.Columns.CityId以字符串形式返回列的名称(不带Tablename,生成的sql如下所示:

q = q.And(City.Columns.CityID).IsEqualTo(cityId);
sql server不知道您是要选择tableA.tableAID还是tableB.tableAID,因此它会抛出异常(即使在独立查询工具中也是如此)

如果您与

SELECT tableAID
FROM tableA
INNER JOIN tableB ON tableA.tableAID = tableB.tableAID
结构而不是

Table.Columns.Something
和多个表,您应该始终将它们与Table.Schema.QualifiedName连接起来,因为它们只是列名称的字符串表示形式

Table.SomethingColumn

实际上,最后一个“q=q.And(AccountAddress.CityIDColumn).IsEqualTo(cityId)”创建了空值。因此,我改为“q=q.And(City.Columns.cityId).IsEqualTo(cityId)”。现在,我得到了“不明确的列名'cityId'。错误。现在该怎么办?请帮助。您能更新您的问题以包含字符串s=q.BuildSqlStatement()的值吗;?或者您可能需要升级您的亚音速版本,您正在运行什么?问题使用亚音速版本编辑并由它生成sql查询亚音速2.1有一个问题,可能已由2.2修复,因此如果升级是一个选项。或者,当您将City.CityIDColumn放回并构建SQLstatement时会发生什么情况?是y吗我们的cityId变量null可能首先导致了这种情况?如果是这种情况,您需要进行IsNull检查。