含有多个条件的linq with子句的问题

时间:2011-11-09 17:46:30

标签: c# sql-server 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" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - MONITOREO" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC - MONITOREO\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Networking" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC - Networking\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "Terreno COASIN Casa Matriz" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"Terreno COASIN Casa Matriz\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "Terreno COASIN Ventanas" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"Terreno COASIN Ventanas\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Calidad" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Aplicaciones" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC - Calidad\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - SAP" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC - SAP\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "NOC - Versionamiento" && grupo.tipo == "E" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"NOC - Versionamiento\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_MANTSIGER" && grupo.tipo == "I" && grupo.solicitaTiempos && !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" && grupo.tipo == "I" && grupo.solicitaTiempos && !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" && grupo.tipo == "I" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"N3CO_CM_DOES_ SAP\" está en la lista");
        Assert.That(grupoResolutor.Any(grupo => grupo.nombre == "N3CO_CM_Monitoreo" && grupo.tipo == "I" && grupo.solicitaTiempos && !grupo.ingresaCondicionCierre).Equals(true), "El grupo \"N3CO_CM_Monitoreo\" está en la lista");
    }

查询仅匹配传递where子句中第一个条件的元素。我的查询或代码中的其他内容是否有问题?上下文是连接到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)

它看起来没问题但只选择id为62的实体:S

再次感谢您的帮助!

0 个答案:

没有答案