2013-02-17 2 views
0

У меня есть следующий запрос, LinqEntity Framework Linq запросов Plus Sql Функция Вложенный запрос

public IEnumerable<DealershipWithDealersViewModel> Get(float latitude, float longitude) 
     { 
      return from dealer in Db.Dealerships 
          join i in Db.NearestDealers(latitude, longitude) 
          on dealer.DealerID equals i.DealerID 
          select new DealershipWithDealersViewModel 
            { 
             DealerID = dealer.DealerID, 
             Dealer = dealer.Dealer, 
             DoSales = dealer.DoSales, 
             DoService = dealer.DoService, 
             AddressProvinceID = dealer.AddressProvinceID, 
             AddressLocationID = dealer.AddressLocationID, 
             Address1 = dealer.Address1, 
             Address2 = dealer.Address2, 
             Tel = dealer.Tel, 
             Fax = dealer.Fax, 
             MapLat = dealer.MapLat, 
             MapLong = dealer.MapLong, 
             Location = dealer.Location.LocationName, 
             DealerUsers = dealer.DealerUsers 
              .Select(y => new DealerUserViewModel 
                  { 
                   DealerUserID = y.DealerUserID, 
                   FirstName = y.Firstname, 
                   Surname = y.Surname, 
                   LandLine = y.LandLine, 
                   Email = y.Email, 
                   Position = y.DealerType.DealerPosition 
                  }) 

            }; 
     } 

enter image description here я получаю следующую ошибку Вложенный запрос не соответствующие ключи. Я ничего не могу найти в сети. Если я загружаю вышеуказанное без DealerUsers, он работает так, как ожидалось, но мне нужны вложенные данные. Спасибо! Ниже, кстати, работает.

public IEnumerable<DealershipWithDealersViewModel> Get(float latitude, float longitude) 
     { 
      return from dealer in Db.Dealerships 
          join i in Db.NearestDealers(latitude, longitude) 
          on dealer.DealerID equals i.DealerID 
          select new DealershipWithDealersViewModel 
            { 
             DealerID = dealer.DealerID, 
             Dealer = dealer.Dealer, 
             DoSales = dealer.DoSales, 
             DoService = dealer.DoService, 
             AddressProvinceID = dealer.AddressProvinceID, 
             AddressLocationID = dealer.AddressLocationID, 
             Address1 = dealer.Address1, 
             Address2 = dealer.Address2, 
             Tel = dealer.Tel, 
             Fax = dealer.Fax, 
             MapLat = dealer.MapLat, 
             MapLong = dealer.MapLong, 
             Location = dealer.Location.LocationName 

            }; 
     } 

enter image description here

Update

Это также работает.

return Db.Dealerships.Select(x => new DealershipWithDealersViewModel 
      { 
       DealerID = x.DealerID, 
       Dealer = x.Dealer, 
       DoSales = x.DoSales, 
       DoService = x.DoService, 
       AddressProvinceID = x.AddressProvinceID, 
       AddressLocationID = x.AddressLocationID, 
       Address1 = x.Address1, 
       Address2 = x.Address2, 
       Tel = x.Tel, 
       Fax = x.Fax, 
       MapLat = x.MapLat, 
       MapLong = x.MapLong, 
       Location = x.Location.Location1, 
       DealerUsers = x.DealerUsers.Select(y => new DealerUserViewModel 
                  { 
                   DealerUserID = y.DealerUserID, 
                   FirstName = y.Firstname, 
                   Surname = y.Surname, 
                   LandLine = y.LandLine, 
                   Email = y.Email, 
                   Position = y.DealerType.DealerType1 
                  }) 
      }); 

enter image description here

+0

Да, я. Entity Framework 5. – TYRONEMICHAEL

+1

вы можете попробовать «DealerID = dealer.DealerId' вместо' DealerID = i.DealerId'? – Pawel

+0

Я сделал и не имеет никакого значения. На этот раз он разозлился. Будет обновлять ответ, чтобы люди не путались. – TYRONEMICHAEL

ответ

0

Это вопрос составности. EF всегда будет пытаться перевести ваш запрос в SQL. Если это удастся, отлично. Если это не так, это не попытка заставить его работать, например. путем переключения на linq на объекты под капотом (как это может сделать linq to sql). Вы пытаетесь присоединиться к результату хранимой процедуры для SQL-запроса. Этого нельзя даже сделать в равнинах SQL, потому что результаты sproc не являются составными, не говоря уже о EF.

Вы используете только результаты поиска в памяти, используя Db.Dealerships.AsEnumerable() и Db.NearestDealers(latitude, longitude).

Так что было бы очень полезно, если бы вы добавили параметр фильтра DealerID к подписи процедуры.

+0

Спасибо за помощь. Просто закончил писать хранимую процедуру и полностью обошел linq до sql. – TYRONEMICHAEL

1

То, что вы делаете, может оказаться невозможным. См.: MSDN. В нижней части этой статьи говорится

Некоторых типов запросов, которые требуют подтягивания ключей от вложенного запроса не поддерживаются.

Смежные вопросы