Tôi đang cố chuyển đổi truy vấn Sql thô cũ trong LINQ bằng Entity Framework tại đây.Toán tử "IN" trong LINQ
Nó đang sử dụng toán tử IN với một tập hợp các mục. Truy vấn là một cái gì đó như thế:
SELECT Members.Name
FROM Members
WHERE Members.ID IN (SELECT DISTINCT ManufacturerID FROM Products WHERE Active = 1)
ORDER BY Members.Name ASC
Kể từ khi sự trở lại của subquery không phải là một chuỗi duy nhất mà là một tập hợp các chuỗi Tôi không thể sử dụng phương pháp String.Contains()
.
Tôi nghĩ về làm một cái gì đó như:
var activeProducts = (
from products in db.ProductSet
where product.Active == true
select product.ManufacturerID);
và sau đó
var activeMembers = (
from member in db.ContactSet
where member.ID.ToString().Contains(activeProducts));
nhưng nó dừng lại ở chứa nói rằng nó có lẽ không hợp lệ ... tôi không thể chọn activeProducts.ManufacturerID vì rõ ràng là sự khôn ngoan không có ở đó vì nó trả về một IQueryable ...
Điểm mấu chốt những gì tôi đang cố gắng làm ở đây là trả về danh sách các thành viên có ít nhất một sản phẩm hoạt động.
Bất kỳ gợi ý nào?
[sửa]
Dưới đây là đoạn code truy vấn đầy đủ ... Tôi đã thử với chứa trên biểu thức thứ hai, LINQ dường như không thích nó:
Server Error in '/' Application. LINQ to Entities does not recognize the method 'Boolean Contains[String](System.Linq.IQueryable``1[System.String], System.String)' method, and this method cannot be translated into a store expression.
var activeProduct =(from product in Master.DataContext.ProductSet
where product.Active == true
&& product.ShowOnWebSite == true
&& product.AvailableDate <= DateTime.Today
&& (product.DiscontinuationDate == null || product.DiscontinuationDate >= DateTime.Today)
select product.ManufacturerID.ToString());
var activeArtists = from artist in Master.DataContext.ContactSet
where activeProduct.Contains(artist.ID.ToString())
select artist;
NumberOfArtists = activeArtists.Count();
artistsRepeater.DataSource = activeArtists;
artistsRepeater.DataBind();
[Chi tiết] ManufacturerID là một GUID vô hiệu hóa rõ ràng ...
Vì lý do nào đó, lớp ContactSet không chứa ny tham khảo các sản phẩm tôi đoán tôi sẽ phải làm một truy vấn tham gia, không có manh mối ở đây.
Không hoạt động, gặp lỗi LINQ. – Erick
Yup, và Linq vẫn không thích nó, tôi vừa phát hiện ra rằng ManufacturerID là một Guid? (nullable) ... nếu tôi làm một 'chọn ManufacturerID.Giá trị' Tôi có điều này: LINQ to Entities không nhận ra phương thức 'Boolean Contains [Hướng dẫn] (System.Linq.IQueryable'1 [System.Guid], System.Guid)' phương pháp, và phương pháp này không thể được dịch sang một cửa hàng biểu hiện. – Erick
Điều này có hiệu quả như toán tử IN không? – tofutim