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


102

У моїй програмі silverlight я намагаюся створити з'єднання з базою даних за допомогою LINQ. Спочатку я додаю новий LINQ до класу 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

Що спричиняє це і як я можу це вирішити?

Дякую.

Відповіді:


255

Чи 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();
    // ...

Мої DataClasses1.Desinger.cs (код, який LINQ автоматично генерує) не включає IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } І коли я використовую: var query = (з p у tblPersoon.Cast <Person> () виберіть p) .Single (); Це дає мені такі помилки на .Cast. 'SilverlightApplication1.Web.tblPersoon' не містить визначення для 'Актори'
Schoof

1
@ThomasSchoof: це може бути друкарська помилка? Властивість викликається tblPersoons(зверніть увагу на s в кінці), а тип - tblPersoon. Ви запитуєте тип, а не властивість типу.
км

Якщо я спробую, var query = (from p in tblPersoons select p).Single();це говорить мені, що tblPersoons навіть не існує.
Schoof

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

27
Додавання за допомогою System.Linq зробило це для мене .. :)
Guruprasad Rao

179

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

using System.Linq;

Дякую за відповідь, але твердження про використання вже було.
Schoof

1
Дякую за відповідь ... це виправило мою проблему !!! але ... чи можна надати додаткове пояснення?
Джо

Чудово !! Дякую
синя піранья

розлючуючи. Дякую.
Баррі,


7

У мене була подібна проблема з генерованими набраними наборами даних, повне повідомлення про помилку було:

Не вдалося знайти реалізацію шаблону запиту для типу джерела '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();

Дякую, мені справді бракувало своєї рівності, що було дурним для мене. Але зараз я отримую таку помилку: Помилка 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; }і раптом запит було розпізнано.


Це, мабуть, говорить його км у його відповіді, але оскільки він згадав, IEnumerable<t>а не DbSet<<YourDomainObject>>мені, довелося пару годин копатись у коді, щоб знайти рядок, який спричинив головний біль.


0

У мене була та сама помилка, але для мене це було пов'язано з наявністю бази даних і таблиці, які були названі однаковими. Коли я додав до свого проекту 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);
}

Я виправив контекст бази даних, і після цього все було добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.