Linq声明使用的位置

时间:2013-11-15 17:35:52

标签: c# linq ef-code-first

我希望获得网络中所有不同朋友和朋友的列表。然后我想拿这个列表并从X日期开始为那些人提取所有新的注册。我在线阅读了一些关于如何使用linq for sql'其中in'条款,但我无法按照我发现的方式应用它。当前代码也没有返回完整的代理,就像我选择的那样。我只选择特定的数据,因为如果它返回完整的代理记录,我似乎无法获取一个不同的列表。要添加到这个问题,现在我已经将这个作为一个匿名类型返回我的注册查询不能运行它。对我来说,最好的方法是什么?

关键问题:

  • 我需要返回代理的完整模型但不同
  • 我需要为上面收集的代理商提取最新的注册信息,最好使用'其中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;

包含对我来说似乎并不合适,但我没有其他办法可以使用它远远接近我所寻找的东西:/

解决 现在删除了Id顶部已设置并且工作正常:)

1 个答案:

答案 0 :(得分:1)

要解决您的第一个问题,您可以传递Distinct() IEqualityComparer<T>,告诉它如何比较对象。这样您就可以选择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,你在哪里查看生成的sql?