12

Używam podejścia CodeFirst i wybrałem problem, w którym muszę przekonwertować DbSet do ObjectQuery. To jest to, co zrobiłem dla konwersji.Jak przekonwertować DbSet w strukturze Entity do ObjectQuery

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; 
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>(); 

gdzie db jest kontekstem dziedziczącym z DbContext a Request jest klasą.

Tak więc, gdy próbuję wywołać metodę, która oczekuje ObjectQuery jako ObjectQueryMethod (objectSet), zgłasza następujący błąd.

„Typ wyrażenia warunkowego nie może być ustalona, ​​ponieważ nie istnieje niejawna konwersja między«System.Data.Entity.DbSet <>»i«System.Data.Objects.ObjectQuery <>»”

Każda pomoc jest mile widziane!

+0

Dlaczego musisz przekonwertować DbSet na ObjectQuery? – Kittoes0124

+0

Podaj więcej szczegółów - czym jest "ObjectQueryMethod"? Twoje obecne podejście jest poprawne. Nie możesz przekonwertować 'DbSet' na' ObjectQuery'. Musisz utworzyć 'ObjectSet' i użyć go zamiast' DbSet'. –

+0

@Kittoes: Próbuję zaimplementować wyszukiwanie zaawansowane w JQGrid i wydaje się, że ObjectQuery jest właściwym narzędziem do analizowania parametrów (filtrów) wysyłanych z powrotem do serwera. – inspiringmyself

Odpowiedz

23

Znalazłem odpowiedź. Oczywiście możliwe jest przekonwertowanie DbSet w strukturze Entity do ObjectQuery przy użyciu poniższych linii kodu.

ObjectContext objectContext = ((IObjectContextAdapter)db).ObjectContext; 
ObjectSet<Request> objectSet = objectContext.CreateObjectSet<Request>("Requests"); 

gdzie

  • db - Kontekst klasa inherting z DbContext.
  • Requests - DbSet<Request> zdefiniowane w klasie kontekstowej.
  • objectSet - Można teraz przekazywać jako ObjectQuery.
+5

AFAIK można zostawić ciąg znaków jako parametr, co czyni go mniej error-pron: 'objectContext.CreateObjectSet ();' –

2

Dzięki za poprawną odpowiedź "inspiringmyself"; to jest po prostu rozwinięcie twojej odpowiedzi. Udało mi się zrobić to z typu rodzajowego, więc po prostu się nią dzielić:

private List<T> GetByCustomCriteria<T>(string criteria) where T: class 
{ 
    var objectContext = ((IObjectContextAdapter)_myModelEntities).ObjectContext; 
    //note: _myModelEntities is a DbContext in EF6. 
    var objectSet = objectContext.CreateObjectSet<T>(); 
    return new List<T>(objectSet.Where(criteria)); 
} 

I pomyślałem powyższe stanowisko może zrobić z przykładu jakie kryteria wysłać tak oto przykład:

//sample criteria for int field: 
var myClientById = GetByCustomCriteria<Client>("it.Id == 1");` 

//sample criteria for string field, note the single quotes 
var myClientByName = GetByCustomCriteria<Client>("it.Surname == 'Simpson'"); 
Powiązane problemy