使用Linq将自定义模型索引与C#中的int数组进行比较

时间:2012-12-01 21:55:57

标签: c# linq

我目前正在使用Code First和Linq为实体开发一个网站。 我有一个名为Productos的自定义模型,其中包含一个名为Especificaciones的自定义模型列表,其中还包含一个名为Etiquetas的自定义模型。 Etiquetas有一个名为EtiquetaId的财产。

这是我模特的一个例子:

    public class ObjectProducto
    {
         public IEnumerable<ObjectEspecificaciones> Especificaciones { get; set; }
    }

    public class ObjectEspecificaciones
    {
         public IEnumerable<Etiquetas> etiquetas { get; set; }
    }

    public  class Etiquetas
    {
           [Key]
           [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
           public int EtiquetaId { get; set; }
           public string texto { get; set; }
    }

我有一个填充了视图中值的int数组,该数组称为MyOptions。

我需要在MyOptions中获取包含EtiquetaId所有Etiquetas的所有Especificaciones。

此时我已经检索了所有与MyOptions中的任何值匹配的Especificaciones,但我需要符合所有MyOptions值的Etiquetas Inside Especificaciones。

我有来自Productos的值,所有Especificaciones和所有Especificaciones中的所有礼仪都在一个名为procatm的var中。

目前我的查询如下:

ProductosCatalogo = 
    (from procatm in catm.ProductosCatalogo 
     where procatm.Especificaciones.Any(e => e.etiquetas.Any(et =>                
                                  et.tipo_etiqueta.CompareTo("categoria") != 0 && 
                                  et.tipo_etiqueta.CompareTo("tipo") != 0 && 
                                  MyOptions.Contains(et.EtiquetaId))) 
     select procatm).AsEnumerable()

我不知道我是否可以制作像

这样的东西
ProductosCatalogo = 
    (from procatm in catm.ProductosCatalogo 
     where procatm.Especificaciones.Any(e => e.etiquetas.Any(et =>  
                                  et.tipo_etiqueta.CompareTo("categoria") != 0 && 
                                  et.tipo_etiqueta.CompareTo("tipo") != 0 &&
                                  MyOptions.All(...)..... 
     select procatm).AsEnumerable()

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

你在SelectMany之后,SelectMany基本上展平了集合,例如像{1,2}和{3,4}这样的两个集合变成{1,2,3,4}

试试这个:

       ProductosCatalogo = 
           catm.ProductosCatalogo
           .Where(pc => pc.Especificaciones.Any(e => e.etiquetas.Any(et => et.tipo_etiqueta.CompareTo("categoria") != 0 && et.tipo_etiqueta.CompareTo("tipo") != 0 && MyOptions.Contains(et.EtiquetaId))))
           .SelectMany(pc => pc.Especificaciones.SelectMany(et => et.etiquetas));

答案 1 :(得分:0)

如果我理解正确,那么您只需要将第二个Any替换为All

ProductosCatalogo = 
    (from procatm in catm.ProductosCatalogo 
     where procatm.Especificaciones.Any(e => e.etiquetas.All(et =>
                                 et.tipo_etiqueta.CompareTo("categoria") != 0 &&
                                 et.tipo_etiqueta.CompareTo("tipo") != 0 && 
                                 MyOptions.Contains(et.EtiquetaId))) 
     select procatm).AsEnumerable()

在这种情况下,所有Especificaciones的礼节都应该出现在MyOptions数组中。

答案 2 :(得分:0)

我相信我还没有解释这个问题。 只需检查一个Etiquetas数组是否是另一个数组的子集,但opciones中的所有元素都包含在Ienumerable标记中。

找到答案:)

感谢所有提交答案的人:D

public bool IsSubsetof(int[] opciones, IEnumerable<Etiquetas> tags)
{ 
    int[] tagens;
    tagens= new int[tags.Count()];
    for (int i = 0; i < tagens.Length; i++)
    {
        tagens[i] = tags.ToArray()[i].EtiquetaId;
    }
    return !opciones.Except(tagens).Any();
}