【问题标题】:Could not find an implementation of the query pattern找不到查询模式的实现
【发布时间】:2012-01-03 04:27:30
【问题描述】:

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


    【解决方案1】:

    tblPersoon 是否实现了IEnumerable<T>?您可能需要这样做:

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

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

    • 您缺少 LINQ 命名空间使用 (using System.Linq)
    • 您查询的类型未实现IEnumerable&lt;T&gt;

    编辑

    除了查询类型(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 自动生成)不包括 IEnumerablepublic System.Data.Linq.Table&lt;tblPersoon&gt; tblPersoons { get { return this.GetTable&lt;tblPersoon&gt;(); } } 当我使用: var query = (from p in tblPersoon.Cast() select p).Single();它在.Cast 上给了我以下错误。 “SilverlightApplication1.Web.tblPerson”不包含“Cast”的定义
    • @ThomasSchoof:会不会是错字?属性称为tblPersoons(注意末尾的s),而类型是tblPersoon。您查询类型,而不是类型上的属性。
    • 如果我尝试 var query = (from p in tblPersoons select p).Single(); 它告诉我 tblPersoons 甚至不存在。
    • 我不认为 LINQ to SQL 是为了更新数据库(因此在 Language INtegrated Query 中使用 query),但是您可以在 LINQ to SQL MSDN page 上找到有关这些主题的一些帮助(更新而不查询部分)。
    • 添加 using System.Linq 为我做到了.. :)
    【解决方案2】:

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

    using System.Linq;
    

    【讨论】:

    • 感谢您的回答,但是using语句已经在那里了。
    • 感谢您的回答...这纠正了我的问题!!!但是...您可以提供其他解释吗?
    • 太棒了!谢谢
    • 真气。谢谢。
    • 这个! Intellisense 无法识别添加 using 语句。
    【解决方案3】:

    确保包含这些参考:

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

    然后添加using语句

    using System.Linq;
    

    【讨论】:

      【解决方案4】:

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

      using System.Linq;
      

      【讨论】:

      • 这就是答案
      【解决方案5】:

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

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

      这是一种享受。

      【讨论】:

        【解决方案6】:

        你缺少一个相等性:

        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”的查询模式的实现。找不到“哪里”。
        【解决方案7】:

        对于那些因为这个错误浪费了太多时间的人(比如我):

        我收到了同样的错误:“找不到源类型 '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&lt;Contact&gt; Contacts { get; set; },突然查询被识别。


        这可能是 k.m 在他的回答中所说的,但由于他提到了 IEnumerable&lt;t&gt; 而不是 DbSet&lt;&lt;YourDomainObject&gt;&gt;,我不得不在代码中挖掘几个小时才能找到导致这种头痛的行。

        【讨论】:

          【解决方案8】:

          我遇到了与标题所述相同的错误,但对我来说,它只是安装 Microsoft access 12.0 oledb 可再发行组件以与 LinqToExcel 一起使用。

          【讨论】:

            【解决方案9】:

            您好最简单的方法是将此 IEnumerable 转换为 Queryable

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

            请检查此代码:

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

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

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

                猜你喜欢
                • 2012-04-06
                • 2017-10-22
                • 1970-01-01
                • 2012-10-14
                • 2015-09-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多