找不到查询模式的实现


101

在我的Silverlight应用程序中,我试图使用LINQ创建数据库连接。首先,我向SQL类添加一个新的LINQ,并将名为“ 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

是什么原因造成的,我将如何解决?

谢谢。

Answers:


254

tblPersoon执行IEnumerable<T>吗?您可能需要使用以下方法进行操作:

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

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

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

编辑

除了查询类型(tblPersoon)而不是property之外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 =(从tblPersoon.Cast <Person>()中的p选择p).Single(); 它给了我有关.Cast的以下错误。“SilverlightApplication1.Web.tblPersoon”不包含“演员”的定义
Schoof

1
@ThomasSchoof:可能是拼写错误吗?类型为时,称为属性tblPersoons(请注意末尾的stblPersoon。您查询类型,而不是类型的属性。
公里

如果我尝试,var query = (from p in tblPersoons select p).Single();它告诉我tblPersoons甚至不存在。
Schoof

1
我不认为LINQ to SQL的,是为了更新数据库(因此查询的语言集成查询),但是你可以找到一些帮助,就这些议题的LINQ to SQL MSDN页面更新不询问部分)。
公里

27
添加使用System.Linq为我做了.. :)
Guruprasad Rao 2015年

176

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

using System.Linq;

感谢您的回答,但是using语句已经存在。
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

我有与标题所述相同的错误,但对我来说,这只是安装可重新分发与LinqToExcel一起使用的Microsoft Access 12.0 oledb。


0

来做到这一点最简单的方法是将这个IEnumerable的转换成可查询

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

请检查以下代码:

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可能就是km在他的回答中所说的,但是自从他提到IEnumerable<t>而不是DbSet<<YourDomainObject>>我提到以来,我不得不在代码中挖掘了几个小时才找到导致这种头痛的行。


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);
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.