Linq取得了明显的成就

Tom*_*len 3 c# linq random distinct

我有查询:

var q = (
    from c in db.tblStoreRecommendations
    where
    itemIDsInCart.Contains(c.ItemID)
    && !itemIDsInCart.Contains(c.RecommendItemID)
    select c
);
Run Code Online (Sandbox Code Playgroud)

它将返回以下内容:

ID    ItemID    RecommendItemID    Message
------------------------------------------
1     25        3                  Msg here
2     26        3                  Something else
3     27        8                  Another message
Run Code Online (Sandbox Code Playgroud)

我需要查询来过滤掉具有相同结果的查询RecommendItemID,这不应该多次出现在返回的结果中.

如果存在两个,它可以使用(随机选择最好).因此返回的结果应该省略记录ID 1或2.

谁能告诉我该怎么做呢?谢谢!

use*_*116 6

一种方法是使用GroupBy,然后从每个组中选择第一个项目:

var q = (
    from c in db.tblStoreRecommendations
    where
        itemIDsInCart.Contains(c.ItemID)
     && !itemIDsInCart.Contains(c.RecommendItemID)
    select c
).GroupBy(c => c.RecommendItemID)
 .Select(g => g.First());
Run Code Online (Sandbox Code Playgroud)

如果您使用它来显示随机评论,我建议将其强制使用代码而不是LINQ查询,省略First如下:

var q = (
    from c in db.tblStoreRecommendations
    where
        itemIDsInCart.Contains(c.ItemID)
     && !itemIDsInCart.Contains(c.RecommendItemID)
    select c
).GroupBy(c => c.RecommendItemID)
 .Select(g => g.ToArray());

var random = new Random();
foreach (var r in q)
{
    var rec = r[random.Next(r.Length)];
    // use your recommendation
}
Run Code Online (Sandbox Code Playgroud)