2017-06-13 56 views
1

我有這個類在我的代碼,第一個實體框架上下文如下 -LINQ計數同桌

class User 
{ 
    int UserId; 
    string Name;; 
    int ParentId; 
} 

數據庫表:

UserId Name ParentId 
    1   abc  0 
    3   pqr  1 
    4   xyz  1 

我想從像如上數據選擇 -

UserId  Name ChildQuantity 
    1   abc  2 
    3   pqr  0 
    4   xyz  0 

我可以使用LINQ或Lambda嗎?

回答

2

你可以加入表本身(你需要一組在這裏加入):

from u in db.Users 
join c in db.Users on u.UserId equals c.ParentId into children 
select new 
{ 
    u.UserId, 
    u.Name, 
    ChildQuantity = children.Count() 
}; 

或者你可以安裝在用戶類兒童的集合導航屬性。有了這個導航屬性查詢將如下所示:

from u in db.Users 
    select new { 
     u.UserId, 
     u.Name, 
     ChildQuantity = u.Children.Count() 
    }; 

我相信它有點清潔。所有你需要做的 - 增加關聯屬性兒童:

public class User 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; }   
    public int? ParentId { get; set; } // Note: this property is not required 
    public IList<User> Children { get; set; } 
} 

並提供映射:

modelBuilder.Entity<User>().HasMany(u => u.Children) 
    .WithOptional().HasForeignKey(u => u.ParentId).WillCascadeOnDelete(false); 

而生成的查詢會是這樣的:

SELECT 
    [Extent1].[UserId] AS [UserId], 
    [Extent1].[Name] AS [Name], 
    (SELECT 
     COUNT(1) AS [A1] 
     FROM [dbo].[Users] AS [Extent2] 
     WHERE [Extent1].[UserId] = [Extent2].[ParentId]) AS [C1] 
    FROM [dbo].[Users] AS [Extent1] 
+0

@Servey,我嘗試導航屬性的方法。但它會給出異常 - 「EntityFramework.dll中出現」System.Data.Entity.ModelConfiguration.ModelValidationException「。任何幫助? –

+0

@ s.k.paul選項與'加入'工作沒有任何問題? –

+0

連接工作正常。我剛剛嘗試了你建議的其他選項「協會財產」。這裏是錯誤的詳細信息 - 「 UserDetail_Children_Source_UserDetail_Children_Target::參照約束的從屬角色中的所有屬性的類型必須與主角色中的相應屬性類型相同,實體的'ParentId' UserDetail'與參考約束'UserDetail_Children'中的實體'UserDetail'上的屬性'UserId'的類型不匹配。「 –

2

像這樣的東西?

var ans = from p in src select new { p.UserID, p.Name, ChildQuantity = src.Where(c => c.ParentId == p.UserID).Count() }; 
+0

聽起來不錯。它實際上會起作用嗎?讓我檢查一下。無論如何,感謝這個想法。 –

+0

其工作。但謝爾蓋Berezovskiy的回答更具描述性。 –