2011-10-20 12 views
7

Uzyskuję dostęp do zdalnego źródła danych i stwierdziłem, że łączenie grupowe powoduje przekształcenie zapytania IQueryable w pytanie IEnumerable,Łączenie grup powoduje, że IQueryable zmienia się w IEnumerable, dlaczego?

: czy wpłynie to na wydajność? Chcę odciążyć tyle zapytania do bazy danych, jak to możliwe, i nie wykonać coś w pamięci ...

var allusers = repo.All<User>().Where(x => x.IsActive); 
var _eprofile = repo.All<Profile>() 
    .Where(x => x.IsProfileActive) 
    .Join(allusers, x => x.UserID, y => y.UserID, (x, y) => new 
    { 
     eProfile = x, 
     profile = y 
    }) 
    .GroupJoin(_abilities, x => x.eProfile.ID, y => y.ID, (x, y) => new QuoteDTO 
    { 
     UserID = x.profile.Login, 
     Email = x.profile.Email, 
     Tel = x.profile.Tel, 
     Mobile = x.eProfile.Mobile, 
     CompanyID = x.profile.CompanyID, 
     Ability = y.Select(c => new AbilityDTO 
    { 
     Name= c.Name 
    }) 

    }); 

Linia: .GroupJoin (_abilities, x => x.eProfile.ID Y => y.ID, (x, y)> New QuoteDTO

  1. _abilities jest IQueryable, uzyskać zdolność użytkownika, zbiór obiektów
  2. druga część (x , y) - tutaj zostaje przekształcona w IEnumerable ...

var cLists = List<int>(); // ta kolekcja jest wypełniana od kodu klienta, powiedzmy to // zawiera 1,3,55 argumentów sake ...

var _abilities= repo.All<UserAbility>() 
     .Where(x => x.Status == Status.Active.ToString()) 
     .Where(x => cLists.Contains(x.CompetencyID)); 

UWAGA: powodem, zastosowanie var jest tak, że można przekształcić w obiekt mój gust, używałem dużo anonimowych typów zanim zostały wstawione obiekty DTO ...

+0

Który bit jest "przekształcony w IEnumerable"? A co to _ możliwości? –

+0

Jest to sub-zapytanie, zaktualizowałem powyższy kod ... – Haroon

+0

Czy '_abilities' to' IQueryable'? Jakie są typy danych wszystkich zmiennych? Proszę nie używać 'var', nie możemy wywnioskować typów zmiennych ani kompilatora. – Greg

Odpowiedz

1

definicja IQueryable:

public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable 

... i ObjectQuery:

ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>, IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource 

większość (? Wszystko) wyrażeń LINQ zwraca rzutować obiektu jako IEnumerable. Ale typ obiektu pozostaje typem, który zaczął jako.

Nie, baza danych nie jest trafiona, gdy kwerenda LINQ-to-Entities jest rzutowana jako IEnumerable, więc wydajność nie jest zagrożona. Możesz, jeśli chcesz, uaktualnić do IQueryable lub ObjectQuery.

Edycja: Dla wyjaśnienia, wywołanie ToArray() na instancji ObjectQuery, IQueryable lub IEnumerable powoduje trafienie w bazę danych i pobranie zestawu wyników.

Edytuj: Utworzenie nowego obiektu w zapytaniu (np. Nowy QuoteDTO) spowoduje trafienie w bazę danych, ponieważ nie ma możliwości zapisania nowego obiektu w zapytaniu SQL. Przepraszam, tęskniłem za tym wcześniej.

+0

Wygląda na to, że mój kod faktycznie trafił w db dla jego sub zapytania, to jest mój rzeczywisty problem, Myślałem, że zadając powyższe pytanie pomoże mi rozwiązać ten też – Haroon

+0

You ' w porządku. Edytowałem swoją odpowiedź. Utworzenie "nowego" obiektu w zapytaniu trafi do bazy danych i zwróci zestaw wyników. – ken

+0

Więc powinienem zrobić annonimowy obiekt dla każdego zapytania, w ten sposób nie uderzę w bazę danych? – Haroon

Powiązane problemy