No se pudo encontrar una implementación del patrón de consulta


103

En mi aplicación Silverlight, estoy tratando de crear una conexión de base de datos usando LINQ. Primero agrego una nueva clase LINQ to SQL y arrastro mi tabla llamada "tblPersoon" a ella.

Luego, en mi archivo de servicio, trato de ejecutar la siguiente consulta:

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

Pero en tblPersoon me da el siguiente error.

No se pudo encontrar una implementación del patrón de consulta para el tipo de fuente 'SilverlightApplication1.Web.tblPersoon'. 'Donde' no encontrado.

E incluso cuando intento lo siguiente:

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

Me da un error que dice "Seleccionar" no encontrado.

El código para la clase generada para mi tabla se puede encontrar aquí: http://pastebin.com/edx3XRhi

¿Qué está causando esto y cómo podría solucionarlo?

Gracias.

Respuestas:


255

¿La está tblPersoonimplementando IEnumerable<T>? Es posible que deba hacerlo usando:

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

Este tipo de error ( No se pudo encontrar una implementación del patrón de consulta ) generalmente ocurre cuando:

  • Falta el uso del espacio de nombres LINQ (using System.Linq )
  • El tipo que está consultando no se implementa IEnumerable<T>

Editar :

Aparte del hecho de que consulta el tipo ( tblPersoon) en lugar de la propiedad tblPersoons, también necesita una instancia de contexto (clase que define la tblPersoonspropiedad), como esta:

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

Mi DataClasses1.Desinger.cs (el código LINQ genera automáticamente) no incluye IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } Y cuando uso: var query = (from p in tblPersoon.Cast <Person> () select p) .Single (); Me da los siguientes errores en .Cast. 'SilverlightApplication1.Web.tblPersoon' no contiene una definición para 'Cast'
Schoof

1
@ThomasSchoof: ¿podría ser un error tipográfico? La propiedad se llama tblPersoons(tenga en cuenta la s al final) mientras que el tipo es tblPersoon. Consulta el tipo, en lugar de la propiedad sobre el tipo.
km

Si lo intento var query = (from p in tblPersoons select p).Single();, me dice que tblPersoons ni siquiera se excita.
Schoof

1
No creo que LINQ to SQL estuviera destinado a actualizar la base de datos (por lo tanto, consultar en Language INtegrated Query), sin embargo, puede encontrar ayuda con esos temas en la página LINQ to SQL MSDN ( sección Actualización sin consultar ).
km

28
Agregar usando System.Linq lo hizo por mí .. :)
Guruprasad Rao

180

Es posible que deba agregar una usingdeclaración al archivo. La plantilla de clase de Silverlight predeterminada no la incluye:

using System.Linq;

Gracias por la respuesta, pero la declaración de uso ya estaba allí.
Schoof

1
Gracias por la respuesta ... esto corrigió mi problema !!! pero ... ¿hay alguna explicación adicional que pueda proporcionar?
Joe

¡¡Increíble!! Gracias
piraña azul

exasperante. Gracias.
Barry

30

Asegúrese de que se incluyan estas referencias:

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

Luego agregue la declaración de uso

using System.Linq;

1
Muchas gracias
Mohammed Z. Aljezawi

7

Tuve un problema similar con conjuntos de datos generados fuertemente tipados, el mensaje de error completo fue:

No se pudo encontrar una implementación del patrón de consulta para el tipo de fuente 'MyApp.InvcHeadDataTable'. 'Donde' no encontrado. Considere especificar explícitamente el tipo de variable de rango 'fila'.

De mi código:

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

Así que hice lo que sugirió y especifiqué explícitamente el tipo:

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

Que funcionó de maravilla.


5

Te falta una igualdad:

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

where la cláusula debe resultar en un booleano.

O no deberías usar whereen absoluto:

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

Gracias, de hecho estaba perdiendo mi igualdad, lo cual fue una estupidez de mi parte. Pero ahora recibo el siguiente error: Error 1 No se pudo encontrar una implementación del patrón de consulta para el tipo de fuente 'SilverlightApplication1.Web.tblPersoon'. 'Donde' no encontrado.
Schoof

0

Tuve el mismo error que se describe en el título, pero para mí simplemente estaba instalando Microsoft Access 12.0 oledb redistributable para usar con LinqToExcel.


0

Hola, la forma más fácil de hacer esto. es convertir este IEnumerable en un Queryable

Si se puede consultar, realizar consultas se vuelve fácil.

Por favor revise este código:

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

Asegúrese de incluir System.Linq . De esta forma se resolverá su error.


0

Para aquellos de ustedes (como yo) que perdieron demasiado tiempo con este error:

Recibí el mismo error: "No se pudo encontrar la implementación del patrón de consulta para el tipo de fuente 'DbSet'", pero la solución para mí fue corregir un error en el nivel de DbContext.

Cuando creé mi contexto tenía esto:

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

        public DbSet Contacts { get; set; }
    }

Y mi Repositorio (estaba siguiendo un patrón de Repositorio en la guía ASP.NET) se veía así:

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

Mi problema provino de la configuración inicial de mi DbContext, cuando usé DbSet como genérico en lugar del tipo.

He cambiado public DbSet Contacts { get; set; }a public DbSet<Contact> Contacts { get; set; }y de pronto se reconoció la consulta.


Esto es probablemente lo que dice km en su respuesta, pero como lo mencionó IEnumerable<t>y no DbSet<<YourDomainObject>>, tuve que buscar en el código durante un par de horas para encontrar la línea que causó este dolor de cabeza.


0

Tuve el mismo error, pero para mí, se atribuyó a tener una base de datos y una tabla con el mismo nombre. Cuando agregué el objeto de entidad ADO .NET a mi proyecto, generó mal lo que quería en el archivo de contexto de mi base de datos:

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

que debería haber sido:

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

Y

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

que en realidad no necesitaba, así que lo comenté.

Estaba tratando de tirar de mi tabla de esta manera, en mi controlador, cuando recibí mi error:

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);
}

Corregí el contexto de mi base de datos y todo estuvo bien, después de eso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.