我目前正在使用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()
有人可以帮忙吗?
答案 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();
}