Я пытаюсь преобразовать старый необработанный запрос Sql в Linq с Entity Framework здесь.
Он использовал оператор IN с набором элементов. Запрос был примерно таким:
SELECT Members.Name
FROM Members
WHERE Members.ID IN ( SELECT DISTINCT ManufacturerID FROM Products WHERE Active = 1)
ORDER BY Members.Name ASC
Поскольку возврат подзапроса - это не одна строка, а набор строк, я не могу использовать метод String.Contains()
.
Я подумал о том, чтобы сделать что-то вроде:
var activeProducts = (
from products in db.ProductSet
where product.Active == true
select product.ManufacturerID);
а затем
var activeMembers = (
from member in db.ContactSet
where member.ID.ToString().Contains(activeProducts));
но он останавливается в содержимом, говоря, что имеет недопустимые аргументы... Я не могу выбрать activeProducts.ManufacturerID, потому что очевидно, что proprety не существует, поскольку он возвращает IQueryable...
В нижней строке, что я пытаюсь сделать здесь, нужно вернуть список членов, у которых есть хотя бы один активный продукт.
Любые подсказки?
[править]
Здесь полный код запроса... Я попробовал с содержимым во втором выражении, Linq, похоже, не понравилось:
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();
[Подробнее] ПроизводительID - это нулевой GUID, видимо...
По какой-то причине класс ContactSet не содержит ссылок на продукты, которые, я думаю, мне нужно будет выполнить запрос соединения, никаких подсказок здесь.