Não foi possível encontrar uma implementação do padrão de consulta


101

Em meu aplicativo Silverlight, estou tentando criar uma conexão de banco de dados usando LINQ. Primeiro, adiciono uma nova classe LINQ to SQL e arrasto minha tabela chamada "tblPersoon" para ela.

Então, em meu arquivo de serviço, tento executar a seguinte consulta:

[OperationContract]
public tblPersoon GetPersoonByID(string id)
{
    var query = (from p in tblPersoon where p.id == id select p).Single();

Mas em tblPersoon isso me dá o seguinte erro.

Não foi possível encontrar uma implementação do padrão de consulta para o tipo de fonte 'SilverlightApplication1.Web.tblPersoon'. 'Onde' não foi encontrado.

E mesmo quando tento o seguinte:

var query = (from p in tblPersoon select p).Single();

Recebo um erro dizendo 'Selecionar' não encontrado!

O código da classe gerada para minha tabela pode ser encontrado aqui: http://pastebin.com/edx3XRhi

O que está causando isso e como eu possivelmente resolveria isso?

Obrigado.

Respostas:


254

Está tblPersoonimplementando IEnumerable<T>? Você pode precisar fazer isso usando:

var query = (from p in tblPersoon.Cast<Person>() select p).Single();

Este tipo de erro ( não foi possível encontrar uma implementação do padrão de consulta ) geralmente ocorre quando:

  • Está faltando o uso do namespace LINQ ( using System.Linq)
  • O tipo que você está consultando não implementa IEnumerable<T>

Editar :

Além do fato de você consultar type ( tblPersoon) em vez de property tblPersoons, você também precisa de uma instância de contexto (classe que define a tblPersoonspropriedade), como esta:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...

Meu DataClasses1.Desinger.cs (código que LINQ gera automaticamente) não inclui IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } E quando eu uso: var query = (de p em tblPersoon.Cast <Person> () selecione p) .Single (); Isso me dá os seguintes erros em .Cast. 'SilverlightApplication1.Web.tblPersoon' não contém uma definição para 'Elenco'
Schoof de

1
@ThomasSchoof: poderia ser um erro de digitação? A propriedade é chamada tblPersoons(observe o s no final) enquanto o tipo é tblPersoon. Você consulta tipo, em vez de propriedade no tipo.
km

Se eu tentar, var query = (from p in tblPersoons select p).Single();isso me diz que tblPersoons nem existe.
Escola de

1
Não acho que LINQ to SQL foi feito para atualizar o banco de dados (portanto, consulte em Language INtegrated Query), no entanto, você pode encontrar ajuda com esses tópicos na página do LINQ to SQL MSDN ( seção Updating Without Querying ).
km

27
Adicionar usando System.Linq fez isso por mim .. :)
Guruprasad Rao

177

Pode ser necessário adicionar uma usingdeclaração ao arquivo. O modelo de classe padrão do Silverlight não inclui:

using System.Linq;

Obrigado pela resposta, mas a declaração using já estava lá.
Escola de

1
Obrigado pela resposta ... isso corrigiu meu problema !!! mas ... há uma explicação adicional que você possa fornecer?
Joe

Impressionante!! Obrigado
piranha azul de

enfurecedor. Obrigado.
Barry

29

Certifique-se de que essas referências estejam incluídas:

  • System.Data.Linq
  • System.Data.Entity

Em seguida, adicione a instrução using

using System.Linq;

1
Muito obrigado
Mohammed Z. Aljezawi

7

Tive um problema semelhante com conjuntos de dados fortemente tipados gerados, a mensagem de erro completa foi:

Não foi possível encontrar uma implementação do padrão de consulta para o tipo de fonte 'MyApp.InvcHeadDataTable'. 'Onde' não foi encontrado. Considere especificar explicitamente o tipo da variável de intervalo 'linha'.

Do meu código:

        var x =
            from row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

Então, fiz o que sugeri e especifiquei explicitamente o tipo:

        var x =
            from MyApp.InvcHeadRow row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

O que funcionou muito bem.


5

Você está perdendo uma igualdade:

var query = (from p in tblPersoon where p.id == 5 select p).Single();

where cláusula deve resultar em um booleano.

OU você não deve usar where:

var query = (from p in tblPersoon select p).Single();

Obrigado, eu estava realmente sentindo falta da minha igualdade, o que era estúpido da minha parte. Mas agora estou recebendo o seguinte erro: Erro 1 Não foi possível encontrar uma implementação do padrão de consulta para o tipo de origem 'SilverlightApplication1.Web.tblPersoon'. 'Onde' não foi encontrado.
Escola de

0

Eu tive o mesmo erro descrito pelo título, mas para mim foi simplesmente instalar o Microsoft access 12.0 oledb redistributable para usar com o LinqToExcel.


0

A maneira mais fácil de fazer isso é converter este IEnumerable em um Queryable

Se for um questionável, então a realização de consultas torna-se fácil.

Por favor, verifique este código:

var result = (from s in _ctx.ScannedDatas.AsQueryable()
                              where s.Data == scanData
                              select s.Id).FirstOrDefault();
                return "Match Found";

Certifique-se de incluir System.Linq . Desta forma, o seu erro será resolvido.


0

Para aqueles de vocês (como eu) que perderam muito tempo com este erro:

Recebi o mesmo erro: "Não foi possível encontrar a implementação do padrão de consulta para o tipo de origem 'DbSet'", mas a solução para mim foi corrigir um erro no nível DbContext.

Quando criei meu contexto, eu tinha o seguinte:

public class ContactContext : DbContext
    {
        public ContactContext() : base() { }

        public DbSet Contacts { get; set; }
    }

E meu Repositório (eu estava seguindo um padrão de Repositório no guia ASP.NET) era assim:

public Contact FindById(int id)
    {       
        var contact = from c in _db.Contacts where c.Id == id select c;
        return contact;
    }

Meu problema veio da configuração inicial do meu DbContext, quando usei DbSet como genérico em vez do tipo.

Mudei public DbSet Contacts { get; set; }para public DbSet<Contact> Contacts { get; set; }e de repente a consulta foi reconhecida.


Provavelmente é isso que km diz em sua resposta, mas como ele mencionou IEnumerable<t>e não DbSet<<YourDomainObject>>, tive que vasculhar o código por algumas horas para encontrar a linha que causou essa dor de cabeça.


0

Eu tive o mesmo erro, mas para mim, foi atribuído a ter um banco de dados e uma tabela com o mesmo nome. Quando adicionei o objeto de entidade ADO .NET ao meu projeto, ele gerou incorretamente o que eu queria em meu arquivo de contexto de banco de dados:

// Table
public virtual DbSet<OBJ> OBJs { get; set; }

que deveria ter sido:

public virtual DbSet<OBJ> OBJ { get; set; }

E

// Database?
public object OBJ { get; internal set; }

que eu realmente não precisava, então comentei.

Eu estava tentando puxar minha mesa assim, no meu controlador, quando recebi meu erro:

protected Model1 db = new Model1();

public ActionResult Index()
{
    var obj =
        from p in db.OBJ
        orderby p.OBJ_ID descending
        select p;

    return View(obj);
}

Corrigi o contexto do meu banco de dados e tudo ficou bem depois disso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.