Не удалось найти реализацию шаблона запроса


105

В моем приложении Silverlight я пытаюсь создать соединение с базой данных с помощью LINQ. Сначала я добавляю новый класс LINQ to SQL и перетаскиваю в него свою таблицу с именем «tblPersoon».

Затем в своем служебном файле я пытаюсь выполнить следующий запрос:

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

Но в tblPersoon это дает мне следующую ошибку.

Не удалось найти реализацию шаблона запроса для типа источника SilverlightApplication1.Web.tblPersoon. «Где» не найдено.

И даже когда я пробую следующее:

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

Это дает мне сообщение об ошибке «Выбрать» не найдено!

Код для сгенерированного класса для моей таблицы можно найти здесь: http://pastebin.com/edx3XRhi

Что вызывает это и как я могу это решить?

Спасибо.

Ответы:


263

Является ли tblPersoonвнедрение IEnumerable<T>? Возможно, вам придется сделать это с помощью:

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

Ошибка такого типа ( не удалось найти реализацию шаблона запроса ) обычно возникает в следующих случаях:

  • Вам не хватает использования пространства имен LINQ ( using System.Linq)
  • Тип, который вы запрашиваете, не реализует IEnumerable<T>

Редактировать :

Помимо того, что вы запрашиваете type ( tblPersoon) вместо свойства tblPersoons, вам также нужен экземпляр контекста (класс, определяющий tblPersoonsсвойство), например:

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

Мои DataClasses1.Desinger.cs (автоматически генерируемый LINQ код) не включает IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } И когда я использую: var query = (from p in tblPersoon.Cast <Person> () select p) .Single (); Это дает мне следующие ошибки на .Cast. «SilverlightApplication1.Web.tblPersoon» не содержит определения для «Cast»
Schoof

1
@ThomasSchoof: это может быть опечатка? Свойство вызывается tblPersoons(обратите внимание на s в конце), а тип - tblPersoon. Вы запрашиваете тип, а не свойство по типу.
km

Если я попробую, var query = (from p in tblPersoons select p).Single();он скажет мне, что tblPersoons даже не существует.
Schoof

1
Я не думаю, что LINQ to SQL предназначался для обновления базы данных (отсюда и запрос в Language INtegrated Query), однако вы можете найти некоторую помощь по этим темам на странице LINQ to SQL MSDN ( раздел « Обновление без запросов »).
km

30
Добавление с помощью System.Linq сделало это за меня .. :)
Гурупрасад Дж. Рао

184

Возможно, вам потребуется добавить usingв файл заявление. Шаблон класса Silverlight по умолчанию не включает его:

using System.Linq;

Спасибо за ответ, но оператор using уже был там.
Schoof

1
Спасибо за ответ ... это исправило мою проблему !!! но ... можете ли вы дать дополнительное объяснение?
Джо

Потрясающие!! Спасибо
голубая пиранья

бесить. Спасибо.
Барри


7

У меня была аналогичная проблема с сгенерированными строго типизированными наборами данных, полное сообщение об ошибке было:

Не удалось найти реализацию шаблона запроса для типа источника MyApp.InvcHeadDataTable. «Где» не найдено. Рассмотрите возможность явного указания типа переменной диапазона 'row'.

Из моего кода:

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

Итак, я сделал, как он предлагал, и явно указал тип:

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

Что сработало.


5

Вам не хватает равенства:

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

where предложение должно приводить к логическому значению.

ИЛИ вам вообще не следует использовать where:

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

Спасибо, мне действительно не хватало своего равенства, что было глупо с моей стороны. Но теперь я получаю следующую ошибку: Ошибка 1 Не удалось найти реализацию шаблона запроса для типа источника SilverlightApplication1.Web.tblPersoon. «Где» не найдено.
Schoof

0

У меня была та же ошибка, что описана в заголовке, но для меня это была просто установка Microsoft Access 12.0 oledb, распространяемая для использования с LinqToExcel.


0

Привет, самый простой способ сделать это - преобразовать этот IEnumerable в Queryable

Если это запрашиваемый, то выполнение запросов становится простым.

Пожалуйста, проверьте этот код:

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

Убедитесь, что вы включили System.Linq . Таким образом ваша ошибка будет решена.


0

Для тех из вас (вроде меня), которые потратили слишком много времени на эту ошибку:

Я получил ту же ошибку: «Не удалось найти реализацию шаблона запроса для типа источника 'DbSet'», но решение для меня было исправление ошибки на уровне DbContext.

Когда я создал свой контекст, у меня было следующее:

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

        public DbSet Contacts { get; set; }
    }

И мой репозиторий (я следовал шаблону репозитория в руководстве по ASP.NET) выглядел так:

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

Моя проблема возникла из-за первоначальной настройки моего DbContext, когда я использовал DbSet как общий вместо типа.

Я изменил public DbSet Contacts { get; set; }на, public DbSet<Contact> Contacts { get; set; }и вдруг запрос был распознан.


Вероятно, это то, что km говорит в своем ответе, но поскольку он упомянул, IEnumerable<t>а не, DbSet<<YourDomainObject>>мне пришлось копаться в коде в течение пары часов, чтобы найти строку, которая вызвала эту головную боль.


0

У меня была такая же ошибка, но для меня это было связано с тем, что база данных и таблица были названы одинаково. Когда я добавил объект Entity Object ADO .NET в свой проект, он неправильно сгенерировал то, что я хотел в файле контекста базы данных:

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

который должен был быть:

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

А также

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

который мне на самом деле не нужен, поэтому я закомментировал его.

Я пытался втянуть свою таблицу вот так, в своем контроллере, когда получил ошибку:

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

Я исправил контекст своей базы данных, и после этого все было в порядке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.