2016-10-02 34 views
1

此代碼拋出時rawVoters.Count()被調用的異常:EF核心FromSql返回奇數錯誤消息

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」的措辭,所以我用每個標識符替換了表名...並得到了相同的錯誤信息。

我很好奇這裏發生了什麼。

回答

0

因此你剛開Count,您可以指定如圖below.Then沒有問題:)

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

Thanx,Sampath,但我不認爲這是正確的。首先,Voter(as v)表中沒有任何ID字段。 但是你的建議讓我意識到了一些事情:我做了一個「select *」......它與內部聯接將會遠遠超過選民字段。將其更改爲「select v。*」允許執行查詢,並運行Count()。 –

+0

是現在工作還是什麼? – Sampath

0

的問題是,T-SQL中返回的所有字段(選擇列名* )。在EF Core下,返回的字段必須與爲返回的實體指定的字段相匹配,在這種情況下爲Voter。

默認情況下,內部連接與我使用的內部連接相比,返回的遠不止Voter字段。

將SQL更改爲select v。*(其中v是Voters的別名)解決了此問題。