2013-11-15 82 views
0

我期待获得网络中朋友的所有不同朋友和朋友的列表。然后,我想从X日期开始,为这些人提供所有新注册。我已经在网上阅读了大量关于如何使用linq for sql'where in'子句的方法,但是我无法按照发现演示的方式来应用它。当前的代码也不会返回完整的代理,正如我选择的那样。我只选择特定的数据,因为如果它返回完整的代理记录,我似乎无法获取一个不同的列表。为了增加这个问题,现在我已经使这个返回的匿名类型,我的注册查询不能运行它。对我来说最好的办法是什么?Linq声明使用在哪里

关键问题:

  • 我需要返回代理的完整模型,但不同的
  • 我需要拉最新注册等的收集剂中,优选的使用“其中在”条款,所以我不必做一个循环,达到数百万次。

抓斗的人在网络中的不同列表

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(); 

^---利用贾里德的答案中所描述的方法---^

选择最新的解决自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现在,该顶部是设置和它的工作原理:)

+0

为什么你有'动态'而不是'var'? –

+0

小细节,我打算给它添加动态属性,但是这可以改变我对这个类型不熟悉。我制作了一个电子邮件模板处理器系统,它使用动态模型,整个方法的最终模型将是一个动态模型,但这个特殊的调用不一定非要。因为我'修复'第一个查询项目不编译,因为它是一个匿名类型,而不是它以前工作:/ – Tony

回答

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?

+0

谢谢Jared,这似乎已为第一个查询工作。我将在第二部分工作,看看我能不能把它连接起来。没有意识到我可以通过比较它运作良好。 @ user2674389,我在Linqpad中使用这个对我的使用EF的repo类,它似乎工作,也许这将是不同的,当我通过项目运行它。 – Tony

+0

谢谢@Jared,那就是诀窍! :) – Tony