2013-11-15 120 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