Pergunta

Eu estou trabalhando meu caminho através do código MVC Storefront e tentando seguir o caminho de um repositório, um serviço e um modelo que é um poco, fora do contexto dbml / dados. É muito fácil de seguir, na verdade, até que eu comecei a escrever testes e coisas que falharam em uma maneira que eu só não entendo.

No meu caso, a chave primária é um uniqueidentifier em vez de um campo int. Os retornos de repositório um IQueryable:

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

Neste caso, é um restaurante Models.Restaurant é claro, e não _context.Restaurants.Restaurant.

Filtering na classe de serviço (ou em testes de unidade de repositório) contra Todos (), isso funciona apenas como esperado:

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

Isso funciona muito bem, tem uma Model.Restaurant. Agora, se eu tentar as mesmas coisas com o PKID:

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

Se falhar com:

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

Se visto alguns posts similiar onde as pessoas dizem que é porque r => r.Id é [Model.Restaurants] é um nível de classe da camada linq2sql não tem conhecimento de. Para mim, isso significa que a primeira versão não deve funcionar. Claro que, se o meu pk é um int, ele funciona muito bem.

O que realmente está acontecendo aqui? O Senhor sabe, não é muito intuitivo para ter um trabalho e não um trabalho. O que eu estou mal-entendido?

Foi útil?

Solução

Eu acho que o problema aqui é devido ao uso de uma sobrecarga de construtor, e esperando a consulta para preenchê-lo. Quando você faz uma projeção como este, você tem que colocar todas as coisas que você quer ser na consulta projeção no si projecção real. Caso contrário Linq não incluirá que na consulta SQL.

Assim, reescrever seus bits assim:

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

Isso deve resolver-se.

Outras dicas

Não tendo realmente digitado o código para fora, você já tentou

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

Ninja

Isso provavelmente tem a ver com o fato de que você está tentando instanciar o guid na consulta, e eu acho que o LINQ to SQL está tentando convertê-lo em código SQL real antes que o objeto é criado.

Tente instanciar antes da consulta e não na consulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top