当调用rawVoters.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++;
}
错误消息是:
&#34;列&#39; ID&#39;被多次指定为&#39; v&#39;。&#34;
我认为这可能是因为EF Core并不喜欢&#34; x&#34;短语,所以我替换了每个标识符的表名...并得到了相同的错误信息。
我很好奇这里发生了什么。
答案 0 :(得分:0)
因此,您只需获取Count
,就可以指定列名,如下所示。然后没有问题:)
string sql = @"select v.ID from Voters as v
答案 1 :(得分:0)
问题在于T-SQL正在返回所有字段(select *)。在EF Core下,返回的字段必须与为返回的实体指定的字段匹配,在本例中为Voter。
默认情况下,内联接(就像我使用的那样)返回的不仅仅是选民字段。
更改要选择的v。*(其中v是Voters的别名)解决了这个问题。