проблемы с предложением linq with, содержащим более одного условия

#c# #sql-server #linq #entity-framework

#c# #sql-сервер #linq #entity-framework

Вопрос:

Я рефакторингую некоторый код, чтобы использовать только linq в своих запросах к базе данных, и у меня возникли проблемы с этим:

 public void ListaGruposPorListaResolutores ()
    {
        List<Mosaq.Sae.Model.Entidades.GrupoResolutor> grupoResolutor;
        using (var contexto = new Sae.Model.Entidades.Entidades())
        {
            var temp = from rg in contexto.ResolutoresGrupos
                       where rg.Resolutor.id == 62 || rg.Resolutor.id == 110
                       select (rg.Grupo);
            grupoResolutor = temp.ToList();
            //contexto.ResolutoresGrupos.Where(rg => rg.Resolutor.id == 62 || rg.Resolutor.id == 110).Select(rg => rg.Grupo).ToList();
        }

        Assert.That(grupoResolutor.Count, Is.EqualTo(13), "Extrae 13 grupos");

        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - MONITOREO" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC - MONITOREO" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Networking" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC - Networking" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "Terreno COASIN Casa Matriz" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "Terreno COASIN Casa Matriz" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "Terreno COASIN Ventanas" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "Terreno COASIN Ventanas" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Calidad" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Aplicaciones" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC - Calidad" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - SAP" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC - SAP" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Versionamiento" amp;amp; grupo.tipo == "E" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "NOC - Versionamiento" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_MANTSIGER" amp;amp; grupo.tipo == "I" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "N3CO_CM_MANTSIGER" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_CC_SAP_WMS" amp;amp; grupo.tipo == "I" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "N3CO_CM_CC_SAP_WMS" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_DOES_ SAP" amp;amp; grupo.tipo == "I" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "N3CO_CM_DOES_ SAP" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_Monitoreo" amp;amp; grupo.tipo == "I" amp;amp; grupo.solicitaTiempos amp;amp; !grupo.ingresaCondicionCierre).Equals(true), "El grupo "N3CO_CM_Monitoreo" está en la lista");
    }
  

запрос соответствует только элементам, которые передают первое условие в предложении where. Есть ли проблема с моим запросом или что-то еще в коде? контекст — это модель данных entity Framework, подключенная к sql server.

Спасибо!

редактировать — вот старый код:

     using System.Collections.Generic;
using System.Linq;
using Mosaq.Sae.Model.Entidades;

namespace Mosaq.Sae.Model.Conectores
{
    public static class GruposResolutores
    {
        /// <summary>
        /// Listar todos los grupos resolutores en la base de datos.
        /// </summary>
        /// <returns></returns>
        public static List<GrupoResolutor> Listar()
        {
            using (var contexto = new Entidades.Entidades())
            {
                return contexto.GruposResolutores.ToList();
            }
        }
        /// <summary>
        /// Extraer el grupo resolutor especificado.
        /// </summary>
        /// <param name="id">Id del grupo requerido.</param>
        /// <returns></returns>
        public static List<GrupoResolutor> Listar(int id)
        {
            using (var contexto = new Entidades.Entidades())
            {
                return contexto.GruposResolutores.Where(grupoResolutor => grupoResolutor.id == id).ToList();
            }
        }
        /// <summary>
        /// Listar los grupos resolutores a los que pertenece el resolutor especificado.
        /// </summary>
        /// <param name="resolutor">El resolutor.</param>
        /// <returns></returns>
        public static List<GrupoResolutor> Listar(Resolutor resolutor)
        {
            using (var contexto = new Entidades.Entidades())
            {
                return contexto.ResolutoresGrupos.Where(navResolutorGrupo => navResolutorGrupo.Resolutor.id == resolutor.id).Select(navResolutorGrupo => navResolutorGrupo.Grupo).ToList();
            }
        }
        /// <summary>
        /// Listar los grupos resolutores a los que pertenecen los resolutores en la lista especificada.
        /// </summary>
        /// <param name="resolutores">Los resolutores.</param>
        /// <returns>Una lista de los grupos resolutores.</returns>
        public static List<GrupoResolutor> Listar(IEnumerable<Resolutor> resolutores)
        {
            var gruposResolutoresConcatenados = new List<GrupoResolutor>();
            foreach (var resolutor in resolutores)
            {
                gruposResolutoresConcatenados.AddRange(Listar(resolutor));
            }
            return gruposResolutoresConcatenados.Distinct(new ComparadorGrupos()).ToList();
        }

        public static List<GrupoResolutor> Listar (Empresa empresa)
        {
            using (var contexto = new Entidades.Entidades())
            {
                return
                    contexto.GruposResolutoresEmpresas.Where(grupoEmpresa => grupoEmpresa.Empresa.id == empresa.id).
                        Select(grupoEmpresa => grupoEmpresa.GrupoResolutor).ToList();
            }
        }

        class ComparadorGrupos : IEqualityComparer<GrupoResolutor>
        {
            public bool Equals(GrupoResolutor x, GrupoResolutor y)
            {
                return x.id == y.id;
            }

            public int GetHashCode(GrupoResolutor obj)
            {
                return obj.id.GetHashCode();
            }
        }
    }
}
  

Спасибо!

ПРАВКА 2: sql profiler выдает мне следующую команду:

  SELECT 
[Extent1].[grupo_resolutor_id] AS [grupo_resolutor_id], 
[Extent2].[id] AS [id], 
[Extent2].[nombre] AS [nombre], 
[Extent2].[tipo_grupo] AS [tipo_grupo], 
[Extent2].[solicita_tiempos] AS [solicita_tiempos], 
[Extent2].[creado_por] AS [creado_por], 
[Extent2].[created_at] AS [created_at], 
[Extent2].[updated_at] AS [updated_at], 
[Extent2].[ingresa_cond_cierre] AS [ingresa_cond_cierre], 
[Extent2].[ver_en_sae] AS [ver_en_sae], 
[Extent3].[categoria_grupo_id] AS [categoria_grupo_id], 
[Extent3].[especialidad_id] AS [especialidad_id], 
[Extent3].[tipo_atencion_id] AS [tipo_atencion_id]
FROM   [dbo].[agentes_grupos] AS [Extent1]
INNER JOIN [dbo].[grupos_resolutores] AS [Extent2] ON [Extent1].[grupo_resolutor_id] = [Extent2].[id]
left JOIN [dbo].[grupos_resolutores] AS [Extent3] ON [Extent1].[grupo_resolutor_id] = [Extent3].[id]
WHERE [Extent1].[resolutor_id] in (62, 110)
  

Это выглядит нормально, но просто выбирает объекты с идентификатором 62: S

Еще раз спасибо за помощь!

Комментарии:

1. ваше where предложение выглядит нормально, проблема, должно быть, в другом месте. Вы уверены, что есть совпадения для rg.Resolutor.id == 110 ?

2. да, sql-запрос возвращает 13 результатов, и старый метод (который выполнял бы итерацию по списку результатов, каждый с отдельным условием) прошел тест без проблем.

3. вы уверены, что подключаете одну и ту же базу данных? проверьте строку подключения EF…

4. Запустите SQL profiler и покажите SQL-запрос, созданный на основе вашего запроса Linq.

5. Или протестируйте это с помощью linqpad.net , вы увидите сгенерированный SQL и результаты.