Question

Je suis en train de parcourir le code de MVC Storefront et d'essayer de suivre le chemin d'un référentiel, d'un service et d'un modèle qui est un poco, en dehors du contexte dbml / data. C'est assez facile à suivre en fait, jusqu'à ce que je commence à écrire des tests et que les choses échouent d'une manière que je ne comprends tout simplement pas.

Dans mon cas, la clé primaire est un identifiant unique, au lieu d'un champ int. Le référentiel renvoie un IQueryable:

public IQueryable<Restaurant> All()
{
    return from r in _context.Restaurants select new Restaurant(r.Id)
        {
             Name = r.Name
        };
 }

Dans ce cas, le restaurant est un modèle.Restaurant bien sûr, et non pas _context.Restaurants.Restaurant.

Filtrage dans la classe de service (ou dans les tests unitaires du référentiel) contre All (), cela fonctionne comme prévu:

var results = Repository.All().Where(r => r.Name == "BW<3").ToList();

Cela fonctionne très bien, a un Model.Restaurant. Maintenant, si j’essaie les mêmes choses avec le pkid:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList();

Si échoue avec:

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL.

Si vu quelques messages similaires où les gens disent que c'est parce que r = > r.Id est [Model.Restaurants] est un niveau de classe que la couche linq2sql ignore. Pour moi, cela signifie que la première version ne devrait pas fonctionner non plus. Bien sûr, si mon pk est un int, ça marche très bien.

Que se passe-t-il vraiment ici? Seigneur sait que ce n'est pas très intuitif d'avoir un travail et un pas de travail. Qu'est-ce que je comprends mal?

Était-ce utile?

La solution

Je pense que le problème ici est dû à l'utilisation d'une surcharge de constructeur et au fait que la requête doit être complétée. Lorsque vous faites une projection comme celle-ci, vous devez mettre tout ce que vous voulez dans la requête de projection dans la projection réelle elle-même. Sinon, Linq n’inclura pas cela dans la requête SQL.

Alors, réécrivez vos bits comme suit:

return from r in _context.Restaurants select new Restaurant()
        {
             Id=r.Id,
             Name = r.Name
        };

Cela devrait régler le problème.

Autres conseils

N'ayant pas saisi ce code, avez-vous essayé

var results = Repository.All (). Where (r = > r.Id.Equals (new Guid ("088ec7f4-63e8-4e3a-902f-fc6240df0a4b") "). ToList ()

Ninja

cela est probablement dû au fait que vous essayez d'instancier le guid dans la requête, et je pense que LINQ to SQL tente de convertir cela en code SQL réel avant la création de l'objet.

Essayez d’instancier avant la requête et non sur la requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top