IQueryable Lambda Projection Syntax

Ich habe eine IQueryable, deren Entity Framework 4-Objekte ich auf ihre DTO-Entsprechungen projizieren möchte. Ein solches Objekt 'Person' ist eine EF4-Klasse, und die entsprechende POCO PersonP ist eine Klasse, die ich definiert habe. Ich benutze Automapper, um zwischen ihnen abzubilden. Wenn ich jedoch den folgenden Code versuche:

IQueryable<Person> originalModel = _repo.QueryAll();
IQueryable<PersonP> projection = originalModel.Select(e => Mapper.Map<Person, PersonP>(e));

Die Projektion generiert diesen Fehler zur Laufzeit:

LINQ to Entities does not recognize the method 'TestSite.Models.PersonP Map[Person,PersonP](TestSite.DataLayer.Model.Person)' method, and this method cannot be translated into a store expression.

Welche Syntax eignet sich zum Erstellen einesIQueryable<PersonP>projektion mit Automapper? Vielen Dank

P.S. Automapper ist richtig konfiguriert - ich verwende es an anderen Stellen, um zwischen Person und PersonP hin und her zu konvertieren, d. H.Mapper.Map<Person, PersonP>(myPersonObject) gibt ein @ korrekt zurüPersonP Objekt

EDIT (mehr Code):

Ich verwende dies für eine Hilfsfunktion, um EF4-Entity-POCOs (PersonP) an ein Telerik-Grid zu binden. Dadurch werden die Entitäten selbst nicht ordnungsgemäß serialisiert, da sie Zirkelverweise enthalten (d. H. Navigationseigenschaften). Mein Code sieht so aus:

public static GridModel GetGridModel<TEntity, TPoco>(IRepository<TEntity> repo, GridState gridState) where TEntity : EntityObject
{
 var originalModel = repo.QueryAll().ToGridModel(gridState);
 var projection = originalModel.Select(e => Mapper.Map<TEntity, TPoco>(e));


 return projection.ToGridModel(gridState); // applies filters, sorts, pages, etc...
}

das.ToGridModel method ist eine Erweiterungsmethode fürIQueryable und es wird ein komplexes Objekt zurückgegeben, das ich nicht zuverlässig analysieren kann. Daher glaube ich, dass ich die Filterung durchführen muss, nachdem ich die Projektion für POCOs durchgeführt habe.

UPDATE 2:

m die Dinge zu vereinfachen, habe ich eine nicht generische Methode wie diese erstellt:

public static GridModel GetGridModel2(IRepository<Client> repo, GridState gridState)
{
 IQueryable<Client> originalModel = repo.QueryAll();
 IQueryable<ClientP> projection = originalModel.Select(c => ClientToClientP(c));

 return projection.ToGridModel(gridState);
}

private static ClientP ClientToClientP(Client c)
{
 return new ClientP { Id = c.Id, FirstName = c.FirstName };
}

Dieser Code schlägt auch beim Erstellen der Projektion fehl. Ich stelle fest, dass IQueryable.Select () mehrere Überladungen aufweist: Expression> ist eine davon. Könnte ich diesen Funktions- / Delegierungsaufruf mit einer dieser Überladungen darstellen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage