1

私は現在、CodeFirstとLinqtoエンティティを使用してサイトを開発しています。Especificacionesと呼ばれるカスタムモデルのリストを含むProductosと呼ばれるカスタムモデルがあり、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値と一致するEtiquetasInsideEspecificacionesが必要です。

私はProductosからの値を持っており、すべてのEspecificacionesとすべてのEtiquetasは、すでに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()

誰か助けてもらえますか?

4

3 に答える 3

1

SelectManyの後、SelectManyは基本的にコレクションをフラット化します。たとえば、{1、2}と{3、4}のような2つのセットは{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

私があなたを正しく理解しているなら、あなたは2番目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のすべてのEtiquetasはMyOptions配列に存在する必要があります。

于 2012-12-02T09:31:59.387 に答える
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 に答える