找不到查询模式的实现

时间:2011-11-21 17:18:45

标签: c# sql silverlight wcf linq

在我的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

造成这种情况的原因是什么?我怎么可能解决这个问题?

谢谢。

10 个答案:

答案 0 :(得分:193)

tblPersoon是否正在实施IEnumerable<T>?您可能需要使用:

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

这种错误(无法找到查询模式的实现)通常在以下情况下发生:

  • 您缺少LINQ命名空间用法(using System.Linq
  • 您要查询的类型未实施IEnumerable<T>

修改

除了你查询类型(tblPersoon)而不是属性tblPersoons,你还需要一个上下文实例(定义{{​​1}}属性的类),如下所示:

tblPersoons

答案 1 :(得分:134)

您可能需要在文件中添加using语句。默认的Silverlight类模板不包含它:

using System.Linq;

答案 2 :(得分:20)

确保包含这些参考:

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

然后添加using语句

using System.Linq;

答案 3 :(得分:6)

我对生成的强类型数据集有类似的问题,完整的错误消息是:

  

无法找到查询模式的实现   源类型&#39; MyApp.InvcHeadDataTable&#39;。 &#39;凡&#39;未找到。   考虑明确指定范围变量的类型&#39; row&#39;。

从我的代码:

        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;

这是一种享受。

答案 4 :(得分: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();

答案 5 :(得分:2)

您一定忘记在文件中添加 using 语句,如下所示:

using System.Linq;

答案 6 :(得分:0)

我遇到了与标题所描述的相同的错误,但对我来说,它只是安装了Microsoft Access 12.0 oledb redistributable以与LinqToExcel一起使用。

答案 7 :(得分:0)

最简单的方法是将此IEnumerable转换为可查询的

如果它是可查询的,那么执行查询变得容易。

请检查此代码:

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

确保包含 System.Linq 。 这样你的错误就会得到解决。

答案 8 :(得分:0)

对于那些(像我一样)浪费了太多时间的错误:

我收到了同样的错误:&#34;无法找到源类型查询模式的实现&#39; DbSet&#39;&#34;但对我来说解决方案是在DbContext级别修复错误。

当我创建我的上下文时,我有这个:

^<li><a href=".*\.html" title=".*">.* (?:(?!(22|21|13)).)*<\/a><\/li>$

我的存储库(我在ASP.NET指南中遵循了存储库模式)看起来像这样:

public class ContactContext : DbContext
    {
        public ContactContext() : base() { }

        public DbSet Contacts { get; set; }
    }

我的问题来自我的DbContext的初始设置,当我使用DbSet作为泛型而不是类型时。

我将public Contact FindById(int id) { var contact = from c in _db.Contacts where c.Id == id select c; return contact; } 更改为public DbSet Contacts { get; set; },然后突然发现了查询。

这可能是km在他的回答中所说的,但是因为他提到public DbSet<Contact> Contacts { get; set; }而不是IEnumerable<t>我不得不在代码中挖掘几个小时来找到引起这种头痛的线。

答案 9 :(得分:0)

我遇到了同样的错误,但是对我来说,这是由于数据库和表的名称相同。当我将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);
}

我更正了数据库上下文,之后一切都很好。