Je suis en train d'essayer d'utiliser AutoMapper et un motif de repository avec une interface fluide, et je rencontre des difficultés avec la projection Linq. Pour ce que ça vaut, ce code fonctionne bien lorsque l'on utilise simplement des objets en mémoire. Lorsque l'on utilise un fournisseur de base de données, cependant, ça casse lors de la construction du graphe de requête. J'ai essayé à la fois SubSonic et Linq to SQL avec le même résultat. Merci pour vos idées.
Voici une méthode d'extension utilisée dans tous les scénarios - C'est la source du problème car tout fonctionne bien sans utiliser de méthodes d'extension
public static IQueryable ByName(this IQueryable users, string firstName)
{
return from u in users
where u.FirstName == firstName
select u;
}
Voici le code en mémoire qui fonctionne bien
var userlist = new List {new User{FirstName = "Test", LastName = "User"}};
Mapper.CreateMap();
var result = (from u in userlist
select Mapper.Map(u))
.AsQueryable()
.ByName("Test");
foreach (var x in result)
{
Console.WriteLine(x.FirstName);
}
Voici la même chose en utilisant SubSonic (ou Linq to SQL ou autre) qui échoue. C'est ce que j'aimerais réussir à faire fonctionner d'une manière ou d'une autre avec des méthodes d'extension...
Mapper.CreateMap();
var result = from u in new DataClasses1DataContext().Users
select Mapper.Map(u);
var final = result.ByName("Test");
foreach(var x in final) // Échoue ici lorsque le graphe de requête est construit.
{
Console.WriteLine(x.FirstName);
}
L'objectif ici est d'éviter d'avoir à mapper manuellement l'objet "User" généré avec l'objet de domaine "MyUser" - en d'autres termes, j'essaie de trouver un moyen d'utiliser AutoMapper pour ne pas avoir ce type de code de mappage partout où une opération de lecture en base de données est nécessaire :
var result = from u in new DataClasses1DataContext().Users
select new MyUser // Est-ce que cela peut être évité avec AutoMapper ET des méthodes d'extension ?
{
FirstName = v.FirstName,
LastName = v.LastName
};