Estoy tratando de convertir una vieja consulta Sql en Linq con Entity Framework aquí.Operador "IN" en Linq
Estaba utilizando el operador IN con una colección de elementos. La consulta fue algo así:
SELECT Members.Name
FROM Members
WHERE Members.ID IN (SELECT DISTINCT ManufacturerID FROM Products WHERE Active = 1)
ORDER BY Members.Name ASC
Desde el retorno de la subconsulta no es una sola cadena, sino una colección de cadenas no puedo usar el método String.Contains()
.
pensé en hacer algo como:
var activeProducts = (
from products in db.ProductSet
where product.Active == true
select product.ManufacturerID);
y luego
var activeMembers = (
from member in db.ContactSet
where member.ID.ToString().Contains(activeProducts));
pero se detiene en la contiene diciendo que tiene argumentos válidos ... No puedo seleccionar porque activeProducts.ManufacturerID Obviamente, la propiedad no está allí ya que devuelve un IQueryable ...
En pocas palabras, lo que estoy tratando de hacer aquí es devolver una lista de miembros que tienen al menos uno producto activo.
¿Alguna pista?
[editar]
Aquí está el código de consulta completo ... He intentado con la contiene en la segunda expresión, LINQ no parece que les gusta:
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();
[Más información] ManufacturerID es un GUID que puede contener nulos aparentemente ...
Por alguna razón, la clase ContactSet no contiene un En referencia a los productos, supongo que tendré que hacer una consulta de combinación, no hay pistas aquí.
No funciona, tiene un error Linq. – Erick
Sí, y a Linq todavía no le gusta, ¿acabo de descubrir que ManufacturerID es un Guid? (Nullable) ... si hago un 'seleccione ManufacturerID.Valor' Tengo esto: LINQ to Entities no reconoce el método 'Boolean Contiene [Guid] (System.Linq.IQueryable'1 [System.Guid], System.Guid)' método, y este método no se puede traducir a una tienda expresión. – Erick
¿Es esto tan eficiente como el operador IN? – tofutim