0

次のように、自分自身を参照するクラスがあります。

public class Person
{
    int Id { get; set; }
    string Name { get; set; }
    DateTime CreatedOn { get; set; }

    Person Parent { get; set; }
    ICollection<Person> Children { get; set; }
}

必要なのは、子を持つレコードの最新のレコード (「CreatedOn」に基づく) のみで構成されるリスト、または子を持たないレコードの親自体で構成されるリストを返す Linq クエリです。クエリでは、「ファミリ」全体にいくつかのフィルタを適用する必要もあります。たとえば、"John" という名前でフィルタリングしていて、親の名前が "John" だけの場合でも、最新の子を取得する必要があります。

どんな助けでも大歓迎です。

4

4 に答える 4

2

あなたはこれを行うことができます:

var results = db.Persons.Where(p => p.Name == "John")
                        .Select(p => p.Children.OrderByDescending(c => c.CreadedOn).FirstOrDefault() ?? p);

または、クエリ構文を好む場合

var results = 
    from p in db.Persons
    where p.Name == "John"
    select(p => p.Children.OrderByDescending(c => c.CreadedOn).FirstOrDefault() ?? p);

生成された sql は次のようになります。

SELECT 
    (CASE 
        WHEN NOT (EXISTS(
            SELECT TOP (1) NULL AS [EMPTY]
            FROM [Person] AS [t2]
            WHERE [t2].[ParentId] = [t0].[Id]
            ORDER BY [t2].[Id] DESC
            )) THEN 1
        WHEN NOT NOT (EXISTS(
            SELECT TOP (1) NULL AS [EMPTY]
            FROM [Person] AS [t2]
            WHERE [t2].[ParentId] = [t0].[Id]
            ORDER BY [t2].[Id] DESC
            )) THEN 0
        ELSE NULL
     END) AS [value], [t0].[Id], [t0].[ParentId], [t0].[Name], [t0].[CreatedOn]
FROM [Parent] AS [t0]
WHERE [t0].[Name] = @p0
GO
于 2013-04-03T15:30:52.787 に答える
1

Linq-To-Entities では不明ですが、Linq-To-Objects ではこれが機能するはずです。

var lastChildOfJohn = persons.Where(p => p.Name == "John" && p.Children.Any())
    .SelectMany(p => p.Children)
    .OrderByDescending(p => p.CreatedOn)
    .FirstOrDefault(); 
于 2013-04-03T15:33:41.477 に答える
0

Stackオブジェクトは LIFO (Last in First Out Basis) で機能するため、おそらく使用する必要があります。

MSDNへのリンクは次のとおりです:-

http://msdn.microsoft.com/en-us/library/system.collections.stack.aspx

これは私にとって、まさにあなたがやりたいことです。

Stack.Peek メソッドを使用すると、スタックに配置された最後のオブジェクトが自動的に返されます。

また、Pop を使用して最新のオブジェクトを返し、スタックから削除することもできます。

Peek スタックの一番上にあるオブジェクトを削除せずに返します。

Pop スタックの一番上にあるオブジェクトを削除して返します。

于 2013-04-03T15:51:09.940 に答える