1

我目前正在开发一个使用 Code First 和 Linq to 实体的网站。我有一个名为 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 和 EtiquetaId 的 Especificaciones。

在这一点上,我已经检索到与 MyOptions 中的任何值匹配的所有 Especificaciones,但我需要 Etiquetas Inside Especificaciones 与所有 MyOptions 值匹配。

我有来自 Productos 的值,它们的所有 Especificaciones 和所有 Especificaciones 中的所有 Etiquetas 都已经在一个名为 procatm 的变量中。

目前我的查询如下所示:

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()

有人可以帮我吗?

4

3 回答 3

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));
于 2012-12-02T03:25:09.087 回答
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();
}
于 2013-01-08T16:20:04.837 回答
0

如果我理解正确,那么您只需将 second 替换AnyAll

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 的所有 Etiquetas 都应该出现在 MyOptions 数组中。

于 2012-12-02T09:31:59.387 回答