【问题标题】:Linq statement using where in使用 where in 的 Linq 语句
【发布时间】:2013-11-15 17:35:52
【问题描述】:

我希望获得网络中所有不同朋友和朋友的朋友的列表。然后,我想获取该列表并提取自 X 日期以来这些人的所有新注册。我在网上阅读了一堆关于如何将 linq 用于 sql 'where in' 子句的信息,但我无法按照我发现的方式应用它。当前代码也没有返回完整的代理,只是我选择的。我只选择特定数据,因为如果它返回完整的代理记录,我似乎无法获取一个不同的列表。为了增加这个问题,现在我已经将它设为了一个匿名类型,我的注册查询无法针对它运行。我实现这一目标的最佳方式是什么?

关键问题:

  • 我需要返回代理的完整模型但不同
  • 我需要为上面收集的代理提取最新注册,最好使用“where in”子句,这样我就不必执行一个循环访问数据库一百万次。

获取网络中不同的人员列表

var network = agent.Friends.Where(f => f.FriendAgent != null)
                .SelectMany(f => f.FriendAgent.Friends
                    .Select(c => c.FriendAgent)
                    .Where(x => x != null))
                    .Distinct<NPlay.Common.Models.Agent>(new TestEquality())
                .Take(100).ToList();

^---使用Jared在答案中描述的方法解决---^

选择自 X 日期以来的最新注册

var query =
                from s in _signupRepository.List.OrderByDescending(s=>s.Created).Where(s => s.Created >= startDate && s.Created <= endDate && !s.Canceled.HasValue)
                where network.Contains(s.Membership)
                select s;

Contains 对我来说似乎不合适,但我没有其他方法可以使用它与我正在寻找的东西很接近:/

已解决 移除了 Id,因为顶部已经设置并且可以正常工作了 :)

【问题讨论】:

  • 为什么你有dynamic而不是var
  • 小细节,我打算为其添加动态属性,但这可以改变我对类型并不难。我已经制作了一个电子邮件模板处理器系统,它使用动态,整个方法的最终模型将是动态的,但这个特定的调用不一定是。因为我“修复”了项目无法编译的第一个查询,因为它是匿名类型,而不是它之前工作过:/

标签: c# linq ef-code-first


【解决方案1】:

要解决您的第一个问题,您可以传递Distinct() 一个IEqualityComparer&lt;T&gt;,告诉它如何比较对象。这样您就可以选择您的Friend 而不是匿名对象。

public class TestEquality : IEqualityComparer<Friend>
{
    public bool Equals(Friend x, Friend y)
    {
        return x.Id == y.Id && x.Name == y.Name; // or however you determine equality
    }

    public int GetHashCode(Friend obj)
    {
        return obj.GetHashCode();
    }
}

使用network.Contains(s.Membership.Id)会生成一个sql where in,你看过生成的sql了吗?

【讨论】:

  • 感谢 Jared,这似乎对第一个查询有效。我将在第二部分工作,看看我能不能把它连接起来。没有意识到我可以通过比较它运作良好。 @user2674389,我在 Linqpad 中使用它来对抗我使用 EF 的 repo 类,它似乎正在工作,当我在项目中运行它时可能会有所不同。
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2017-11-19
相关资源
最近更新 更多