这段代码在调用rawvoter . count()时抛出异常:
string sql = @"select * from Voters as v
inner join Homes as h on v.HomeID = h.ID
inner join Locations as l on h.LocationID = l.ID
inner join Streets as s on l.StreetID = s.ID
inner join Cities as c on s.CityID = c.ID
inner join VoterAgencies as va on v.CountyID = va.CountyID and v.VoterID = va.VoterID
where (va.AgencyID = @agencyID)
and (c.Name like '%' + @city + '%')
and (v.FirstName like '%' + @firstName + '%')
and (v.LastName like '%' + @lastName + '%')
and (s.Name like '%' + @street + '%')
and ((@voterID = 0) or (v.VoterID = @voterID))";
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add( new SqlParameter( "@agencyID", agencyID ) );
parameters.Add( new SqlParameter( "@city", model.City ) );
parameters.Add( new SqlParameter( "@firstName", model.FirstName ) );
parameters.Add( new SqlParameter( "@lastName", model.LastName ) );
parameters.Add( new SqlParameter( "@street", model.Street ) );
parameters.Add( new SqlParameter( "@voterID", model.VoterID ) );
IQueryable<Voter> rawVoters = _context.Voters
.AsNoTracking()
.FromSql( sql, parameters.ToArray() );
int numVoters = 0;
try
{
numVoters = rawVoters.Count();
}
catch( Exception e )
{
int i = 9;
i++;
}
错误信息是:
"列'ID'被多次指定为'v'。"
我认为这可能是因为EF Core不喜欢"as x"措辞,所以我用表名代替了每个标识符…并得到相同的错误信息。
我很好奇这里发生了什么。
问题是T-SQL返回所有字段(select *)。在EF Core下,返回的字段必须与被返回实体指定的字段匹配,在本例中为Voter。
内部连接,就像我使用的那样,默认情况下返回的远不止Voter字段。
将SQL更改为select v.*(其中v是投票人的别名)解决了问题。
因此您只获得Count
,您可以如下所示指定列名。那就没问题了:)
string sql = @"select v.ID from Voters as v