Подтвердить что ты не робот

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

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

Это дает мне ошибку, говоря "Select" не найден!

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

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

Спасибо.

4b9b3361

Ответ 1

Выполняется ли tblPersoon IEnumerable<T>? Вам может понадобиться сделать это, используя:

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

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

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

Edit

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

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

Ответ 2

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

using System.Linq;

Ответ 3

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

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

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

using System.Linq;

Ответ 4

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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


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

Ответ 9

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

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

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

Ответ 10

У меня была эта проблема, и добавление

using System.Linq;

решил это.