c# - Linq 获取不同的

标签 c# linq random distinct

我有一个问题:

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

它将返回如下内容:

ID    ItemID    RecommendItemID    Message
------------------------------------------
1     25        3                  Msg here
2     26        3                  Something else
3     27        8                  Another message

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

如果存在两个,则可以使用其中一个(最好随机选择)。所以返回结果应该省略记录ID 1或2。

谁能告诉我如何做到这一点?谢谢!

最佳答案

一种方法是使用 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());

如果您使用它来显示随机评论,我建议将其强加到使用代码而不是 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
}

关于c# - Linq 获取不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511964/

相关文章:

.net - 在 XML 属性上使用冒号字符时出错

C# 有效地替换字典中的 -Infinity 值

c# - SelectMany 有什么问题?

r - 检查在 R 脚本中使用随机数生成器的函数的综合方法?

c# - .NET 4.0 和可怕的 OnUserPreferenceChanged 挂起

c# - 在 .Net Core 2.0 和 Angular 中使用 'aspnet-webpack' 时找不到模块 'dotnet publish'

c# - 以编程方式断开网络连接

c# - 在 C# 中基于显式接口(interface)实现实现 == 运算符

c# - 等概率范围内的随机数

java - 从不同类别生成 2 个数字时如何停止获得相同数字