#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 и результаты.