如何将SQL查询转换为Linq? “看过这个产品的人也看过这个产品。”

时间:2016-05-06 03:41:42

标签: c# sql-server linq asp.net-mvc-4

我对linq并不是那么擅长所以我正在尝试组织和排序。

我的查询的目标是,当某人在产品页面上时,我想显示人们也查看过的产品列表。我很确定这个查询是正确的,但我不知道如何转移到linq并让它在我的C#项目中工作。

我试图更改为linq的SQL查询是

    select pv.ProductId,p.Name, count(*) as 'ProductCount'
    from Products p
    join ProductVieweds pv
    on p.ProductID = pv.ProductId
    where UserId in (
         select UserId
         from ProductVieweds pv
         where ProductID = 1 --The 1 in this example is the product the person is viewing.
         )
         and p.ProductID != 1 --change this
    group by pv.ProductId,p.Name
    order by 'ProductCount' desc

到目前为止我能做到的。

    var sub = (
        from p in db.ProductsViewed
        where p.ProductId == product.ProductID
        select p.UserId).ToList();

    var products = (from p in db.Products
                        join pv in db.ProductsViewed on c.ProductID equals p.ProductId
                       where p.ProductID != currentProduct.ProductID
                       where sub.Contains(pv.UserId)
                       select p).GroupBy(c => c.ProductID).ToList();

        PeopleAlsoViewedModel model = new PeopleAlsoViewedModel
        {
            Products = products,
        };

模型

      public class PeopleAlsoViewedModel
{
    public IEnumerable<Product> Products { get; set; }
}

所以我希望能够按产品分组并按计数排序,但我不知道如何做到这一点仍然得到一个IEnumerable&lt;产品&gt;请任何帮助都会很棒,如果你要投票,至少要告诉我原因。

1 个答案:

答案 0 :(得分:0)

好的,所以我想出了如何解决我的问题,并认为我应该发布它,以后任何人都会读到这个。

查询在C#中将如下所示

    var products = (from c in db.Products
                        join p in db.ProductsViewed on c.ProductID equals p.ProductId
                       where c.ProductID != CurrentProduct.ProductID
                       where sub.Contains(p.UserId)
                       group c by c.ProductID into productGrouped
                       orderby productGrouped.Key
                       select productGrouped).SelectMany(group => group.Distinct()).ToList();

SelectMany()将List&lt; IGrouping&LT; key,element&gt;&gt;进入List&lt;组件&gt;我把它区分开来,因为多个人可以查看相同的产品,否则它会返回重复项。