Не удалось найти реализацию шаблона запроса - PullRequest
74 голосов
/ 21 ноября 2011

В моем приложении 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

Что является причиной этого и как я мог бы решить эту проблему?

Спасибо.

Ответы [ 9 ]

199 голосов
/ 21 ноября 2011

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

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

Этот тип ошибки ( Не удалось найти реализацию шаблона запроса ) обычно возникает, когда:

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

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

Помимо факта, что вы запрашиваете тип (tblPersoon) вместо свойства tblPersoons, вам также необходим экземпляр контекста (класс, который определяет свойство tblPersoons), например:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...
137 голосов
/ 21 ноября 2011

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

using System.Linq;
20 голосов
/ 02 марта 2015

Убедитесь, что эти ссылки включены:

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

Затем добавьте оператор using

using System.Linq;
6 голосов
/ 12 августа 2015

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

Не удалось найти реализацию шаблона запроса для Тип источника «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 голосов
/ 21 ноября 2011

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

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

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

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

var query = (from p in tblPersoon select p).Single();
0 голосов
/ 22 октября 2018

У меня была такая же ошибка, но для меня это было связано с наличием базы данных и таблицы с одинаковыми именами.Когда я добавил объект сущности 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);
}

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

0 голосов
/ 17 июня 2018

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

Я получил ту же ошибку: «Не удалось найти реализацию шаблона запроса для типа источника« 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; } и вдруг запрос был распознан.


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

0 голосов
/ 25 февраля 2017

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

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

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

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

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

0 голосов
/ 11 января 2016

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

...