LINQ - 具有相关数据的查询表

时间:2016-03-25 16:01:57

标签: linq asp.net-mvc-5 many-to-many one-to-many

我有一个“产品”表,其中包含相关的“Tegs”

public class Product
{
    public Product()
    {
        Tegs = new List<Teg>();
    }
    [Key]
    public int Id { get; set; }
    public string ProductName { get; set; }
    public virtual ICollection<Teg> Tegs { get; set; }
    public  virtual ICollection<Product> RelatedProducts { get; set; }
}

这是Tegs:

public class Teg
{
     public Teg()
    {

    }

    public int Id { get; set; }
    public string TegName { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

}

鉴于产品ID,使用LINQ我想检索所有至少有一个teg作为所选产品的产品。

我正在使用此代码:

Product product = db.Product.Include(u => u.Tegs).Where(u => u.Id == id).Single();
List<int> tegid = product.Tegs.Select(c => c.Id).ToList();
IEnumerable<Product> relatedProducts = db.Product.Include(u => u.Tegs).Where(p => p.Tegs.Any(t => tegid.Contains(t.Id)));

问题1: 如何从相关产品中排除带有ID的产品?

问题2: 如何将我的List嵌套在相关产品的Linq查询中?

1 个答案:

答案 0 :(得分:0)

关于第一个问题,如果我理解正确,您希望从relatedProducts结果列表中排除具有给定productId的产品。在这种情况下,您只需要在Where()子句中再添加一个条件,如下所示:

IEnumerable<Product> relatedProducts = db.Product
                  .Include(u => u.Tegs)
                  .Where(p => p.Tegs.Any(t => tegid.Contains(t.Id)) && p.Id != id);

关于你的第二个问题,我不太清楚这里的重点是什么。也许您打算将单个往返中的第二个和第三个查询合并到db?