找不到查询模式的实现

问题描述 投票:0回答:11

在我的 silverlight 应用程序中,我尝试使用 LINQ 创建数据库连接。 首先,我添加一个新的 LINQ to SQL 类,并将名为“tblPerson”的表拖入其中。

然后在我的服务文件中我尝试执行以下查询:

[OperationContract]
public tblPersoon GetPersoonByID(string id)
{
    var query = (from p in tblPersoon where p.id == id select p).Single();

但是在 tblPersoon 它给了我以下错误。

找不到源类型查询模式的实现 'SilverlightApplication1.Web.tblPerson'。找不到“哪里”。

即使我尝试以下操作:

var query = (from p in tblPersoon select p).Single();

它给我一个错误,说找不到“选择”!

为我的表生成的类的代码可以在这里找到:http://pastebin.com/edx3XRhi

造成这种情况的原因是什么?我该如何解决这个问题?

谢谢你。

c# sql silverlight wcf linq
11个回答
329
投票

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

266
投票

您可能需要在文件中添加

using
语句。默认的 Silverlight 类模板不包含它:

using System.Linq;

42
投票

确保包含这些参考文献:

  • 系统.Data.Linq
  • 系统.数据.实体

然后添加using语句

using System.Linq;

28
投票

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

using System.Linq;

8
投票

我在生成强类型数据集时遇到了类似的问题,完整的错误消息是:

找不到查询模式的实现 源类型“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
投票

对于那些因为这个错误而浪费了太多时间的人(像我一样):

我收到了同样的错误:“无法找到源类型‘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; }
,突然就识别出了查询。


这可能是 k.m 在他的回答中所说的,但由于他提到了

IEnumerable<t>
而不是
DbSet<<YourDomainObject>>
,我不得不在代码中挖掘几个小时才能找到导致此头痛的行。


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
投票

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

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


0
投票

我也遇到了同样的问题,这段代码救了我的命:


````
using System.Linq

using System.Linq.Dynamic.Core

````
© www.soinside.com 2019 - 2024. All rights reserved.