Не удалось найти реализацию шаблона запроса
В моем приложении 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
Что вызывает это и как я могу это решить?
Спасибо.
Ответы
Ответ 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;
решил это.