/ / Realizando un Contiene dentro de un Intersect - c #, linq

Realización de una Contiene dentro de un Intersect - c #, linq

Tengo una consulta linq bastante complicada que devuelve un elemento y una cadena [] de una columna en la relación de varios a muchos del elemento.

Así que devuelvo un tipo anónimo de este tipo:

var q = from k in db.Items
join m in db.ManyRel on k.Id equals m.ItemID
select new
{
k,
list = (from t in m
where t.ItemID == k.ID
select t.Name)
}

Así que el tipo anónimo es {IQueryable<k>, IQueryable<string>}.

Lo que luego quiero hacer es buscar en la lista intersecciones de string[] input.

q.Select(x => new
{
x.k,
PartialMatches = ?????,
ExactMatches = x.tags.Intersect(input).Count()
});

Actualmente lo tengo trabajando con .Intersect, pero.Intersect () solo coincide con el elemento entero. Me gustaría usar .Contains () dentro de .Intersect () para contar el número de coincidencias parciales.

Preferiría hacer esto sin un método de extensión si es posible.

Edición: @Jon y Timwi

Probé ambas versiones, eran bonitas.es lo mismo, y encuentran si CUALQUIER elemento en la entrada existe parcialmente dentro de x.tags. Me gustaría poder contar cuántos elementos en la entrada existen parcialmente dentro de x.tags, no solo si existe un elemento. Gracias por las respuestas.

Creo que tengo un mejor manejo de las cosas de AsEnumerable () que hace unas noches.

Además, para que conste, porque ustedes dosCurioso, el método Intersect () no se traduce de Linq a SQL y tampoco ninguno de los métodos que propusiste. Todos ellos funcionan bien y lo suficientemente rápido con AsEnumberable () sin embargo.

Respuestas

1 para la respuesta № 1

No necesitas usar Intersect, y no necesita tener una traducción a SQL. Puedes hacerlo en C #:

var results = q.AsEnumerable().Select(x => new
{
x.k,
PartialMatches = x.tags.Count(tag => input.Any(
word => word.Contains(tag))),
ExactMatches = x.tags.Intersect(input).Count()
});

La llamada a AsEnumerable() separa esta parte de la consulta de la base de datos. Todo antes de que se recupere de la base de datos, y el resto se procesará en C #.

Podrías, en teoría, hacer el ExactMatches en SQL (si LINQ to SQL puede traducirlo a SQL,que no estoy seguro de que pueda), pero no es obvio si eso es más eficiente que hacerlo en C #. Depende del tamaño relativo de las colecciones involucradas, incluyendo input.


1 para la respuesta № 2

Bueno, de la manera que puedas exprimir es:

 PartialMatches = x.tags.Where(tag => input.Any(word => word.Contains(tag)))

(o viceversa, no ha dicho de qué manera desea que funcione la contención).

Sin embargo, no espero que esto se traduzca a SQL con éxito ... No estoy seguro de que poder Obtener LINQ para traducir esto en SQL, me temo.