EF Core FromSql返回奇数错误消息

时间:2016-10-02 04:16:14

标签: entity-framework entity-framework-core

当调用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;短语,所以我替换了每个标识符的表名...并得到了相同的错误信息。

我很好奇这里发生了什么。

2 个答案:

答案 0 :(得分:0)

因此,您只需获取Count,就可以指定列名,如下所示。然后没有问题:)

string sql = @"select v.ID from Voters as v

答案 1 :(得分:0)

问题在于T-SQL正在返回所有字段(select *)。在EF Core下,返回的字段必须与为返回的实体指定的字段匹配,在本例中为Voter。

默认情况下,内联接(就像我使用的那样)返回的不仅仅是选民字段。

更改要选择的v。*(其中v是Voters的别名)解决了这个问题。

相关问题