Không thể tìm thấy cách triển khai mẫu truy vấn


102

Trong ứng dụng silverlight của mình, tôi đang cố gắng tạo kết nối cơ sở dữ liệu bằng LINQ. Đầu tiên, tôi thêm một LINQ mới vào lớp SQL và kéo bảng có tên "tblPersoon" vào đó.

Sau đó, trong tệp dịch vụ của mình, tôi cố gắng thực hiện truy vấn sau:

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

Nhưng tại tblPersoon nó cho tôi lỗi sau.

Không thể tìm thấy triển khai mẫu truy vấn cho loại nguồn 'SilverlightApplication1.Web.tblPersoon'. Không tìm thấy 'ở đâu'.

Và ngay cả khi tôi thử những điều sau:

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

Nó cho tôi một lỗi nói rằng không tìm thấy "Chọn"!

Có thể tìm thấy mã cho lớp được tạo cho bảng của tôi tại đây: http://pastebin.com/edx3XRhi

Điều gì đang gây ra điều này và làm thế nào tôi có thể giải quyết điều này?

Cảm ơn bạn.

Câu trả lời:


255

Đang tblPersoonthực hiện IEnumerable<T>? Bạn có thể cần làm điều đó bằng cách sử dụng:

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

Loại lỗi này ( Không thể tìm thấy cách triển khai mẫu truy vấn ) thường xảy ra khi:

  • Bạn đang thiếu sử dụng không gian tên LINQ ( using System.Linq)
  • Loại bạn đang truy vấn không triển khai IEnumerable<T>

Chỉnh sửa :

Ngoài thực tế, bạn truy vấn kiểu ( tblPersoon) thay vì thuộc tính tblPersoons, bạn cũng cần một thể hiện ngữ cảnh (lớp xác định thuộc tblPersoonstính), như thế này:

public tblPersoon GetPersoonByID(string id)
{
    var context = new DataClasses1DataContext();
    var query = context.tblPersoons.Where(p => p.id == id).Single();
    // ...

DataClasses1.Desinger.cs của tôi (mã LINQ tự động tạo) không bao gồm IEnumerable <T>. public System.Data.Linq.Table<tblPersoon> tblPersoons { get { return this.GetTable<tblPersoon>(); } } Và khi tôi sử dụng: var query = (from p in tblPersoon.Cast <Person> () select p) .Single (); Nó cung cấp cho tôi các lỗi sau trên .Cast. 'SilverlightApplication1.Web.tblPersoon' không chứa một định nghĩa cho 'Cast'
Schoof

1
@ThomasSchoof: nó có thể là lỗi chính tả? Thuộc tính được gọi tblPersoons(lưu ý chữ s ở cuối) trong khi kiểu là tblPersoon. Bạn loại truy vấn, thay vì thuộc tính trên loại.
km

Nếu tôi thử var query = (from p in tblPersoons select p).Single();Nó cho tôi biết tblPersoons thậm chí còn không hoạt động.
Schoof

1
Tôi không nghĩ rằng LINQ to SQL được dùng để cập nhật cơ sở dữ liệu (do đó truy vấn trong Truy vấn tích hợp ngôn ngữ), tuy nhiên bạn có thể tìm thấy một số trợ giúp về các chủ đề đó trên trang LINQ to SQL MSDN (phần Cập nhật mà không cần truy vấn ).
km

27
Thêm bằng cách sử dụng System.Linq đã làm điều đó cho tôi .. :)
Guruprasad Rao

179

Bạn có thể cần thêm một usingcâu lệnh vào tệp. Mẫu lớp Silverlight mặc định không bao gồm nó:

using System.Linq;

Cảm ơn vì câu trả lời, nhưng câu lệnh using đã có ở đó.
Schoof

1
Cảm ơn câu trả lời ... điều này đã khắc phục sự cố của tôi !!! nhưng ... bạn có thể giải thích thêm không?
Joe

Tuyệt vời!! Cảm ơn bạn
piranha xanh

tức giận. Cảm ơn bạn.
Barry

30

Đảm bảo bao gồm các tham chiếu này:

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

Sau đó thêm câu lệnh using

using System.Linq;

1
Cảm ơn bạn rất nhiều
Mohammed Z. Aljezawi

7

Tôi đã gặp sự cố tương tự với các tập dữ liệu được đánh máy mạnh được tạo, thông báo lỗi đầy đủ là:

Không thể tìm thấy triển khai mẫu truy vấn cho loại nguồn 'MyApp.InvcHeadDataTable'. Không tìm thấy 'ở đâu'. Hãy xem xét việc chỉ định rõ ràng kiểu của biến phạm vi 'hàng'.

Từ mã của tôi:

        var x =
            from row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

Vì vậy, tôi đã làm như nó đề xuất và chỉ định rõ ràng loại:

        var x =
            from MyApp.InvcHeadRow row in ds.InvcHead
            where row.Company == Session.CompanyID
            select row;

Đó là một điều trị.


5

Bạn đang thiếu một bình đẳng:

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

where mệnh đề phải dẫn đến một boolean.

HOẶC bạn hoàn toàn không nên sử dụng where:

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

Cảm ơn, tôi thực sự đã thiếu sự bình đẳng của mình, điều đó thật ngu ngốc đối với tôi. Nhưng bây giờ tôi gặp phải lỗi sau: Lỗi 1 Không thể tìm thấy triển khai mẫu truy vấn cho loại nguồn 'SilverlightApplication1.Web.tblPersoon'. Không tìm thấy 'ở đâu'.
Schoof

0

Tôi đã gặp lỗi tương tự như mô tả trong tiêu đề, nhưng đối với tôi, đó chỉ là cài đặt Microsoft truy cập 12.0 oledb redistributable để sử dụng với LinqToExcel.


0

Xin chào, cách dễ nhất để làm điều này là chuyển IEnumerable này thành Queryable

Nếu nó là một truy vấn có thể truy vấn, thì việc thực hiện các truy vấn trở nên dễ dàng.

Vui lòng kiểm tra mã này:

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

Đảm bảo bạn bao gồm System.Linq . Bằng cách này, lỗi của bạn sẽ được giải quyết.


0

Đối với những người trong số các bạn (như tôi) đã lãng phí quá nhiều thời gian vì lỗi này:

Tôi đã nhận được lỗi tương tự: "Không thể tìm thấy việc triển khai Mẫu truy vấn cho loại nguồn 'DbSet'" nhưng giải pháp cho tôi là sửa lỗi ở cấp DbContext.

Khi tôi tạo ngữ cảnh của mình, tôi có điều này:

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

        public DbSet Contacts { get; set; }
    }

Và Kho lưu trữ của tôi (tôi đang làm theo mẫu Kho lưu trữ trong hướng dẫn ASP.NET) trông như thế này:

public Contact FindById(int id)
    {       
        var contact = from c in _db.Contacts where c.Id == id select c;
        return contact;
    }

Vấn đề của tôi đến từ thiết lập ban đầu của DbContext, khi tôi sử dụng DbSet làm kiểu chung thay vì kiểu.

Tôi đã thay đổi public DbSet Contacts { get; set; }thành public DbSet<Contact> Contacts { get; set; }và đột nhiên truy vấn được nhận dạng.


Đây có lẽ là những gì km nói trong câu trả lời của anh ấy, nhưng vì anh ấy đã đề cập IEnumerable<t>và không phải DbSet<<YourDomainObject>>tôi đã phải tìm kiếm xung quanh mã trong vài giờ để tìm ra dòng gây ra đau đầu này.


0

Tôi đã gặp lỗi tương tự, nhưng đối với tôi, đó là do có một cơ sở dữ liệu và một bảng được đặt tên giống nhau. Khi tôi thêm Đối tượng Thực thể ADO .NET vào dự án của mình, nó đã tạo sai những gì tôi muốn trong tệp ngữ cảnh cơ sở dữ liệu của mình:

// Table
public virtual DbSet<OBJ> OBJs { get; set; }

mà lẽ ra phải là:

public virtual DbSet<OBJ> OBJ { get; set; }

// Database?
public object OBJ { get; internal set; }

mà tôi thực sự không thực sự cần, vì vậy tôi đã bình luận nó ra.

Tôi đang cố gắng kéo bảng của mình như thế này, trong bộ điều khiển của tôi, thì tôi gặp lỗi:

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

Tôi đã sửa ngữ cảnh cơ sở dữ liệu của mình và tất cả đều ổn sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.