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

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

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

Спасибо.

Schoof
источник

Ответы:

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
Спасибо за ответ ... это исправило мою проблему !!! но ... можете ли вы дать дополнительное объяснение?
Джо
Потрясающие!! Спасибо
голубая пиранья
бесить. Спасибо.
Барри
32

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

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

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

using System.Linq;
MobileMon
источник
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.

BanMe
источник
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>>мне пришлось копаться в коде в течение пары часов, чтобы найти строку, которая вызвала эту головную боль.

TylerSmall19
источник
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);
}

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

vapcguy
источник