2

3つのテーブルをクエリし、CreatedDateタイムスタンプによって決定されたすべてのテーブルの最新のアクティビティを取得したいと思います。各テーブルは、ドメインモデル内のエンティティによって表され、Entity Framework Code First(データ移行なし)を使用してドメインをマップしています。

SQLでクエリがどのように表示されるかはわかっていますが、LinqToEntitiesまたはEntitySqlでクエリを作成する方法がわかりません。Entity Frameworkでこれを行う方法を教えてください。また、Entity Frameworkのクエリメソッドを使用してこのクエリを実行するのが適切な場合でも、教えてください。

よろしくお願いします。

これが私のエンティティです(主キーは基本クラスにあります):

public class Group : EntityThatBelongsToApartmentComplex<int>
{
    public string GroupName { get; set; }
    public string GroupDescription { get; set; }

    [Required]
    public DateTimeOffset CreatedDate { get; protected set; }

    public int CreatedById { get; set; }
    public virtual UserProfile CreatedBy { get; set; }    
}


public class Activity : EntityThatBelongsToApartmentComplex<int>
{
    [StringLength(150)]
    public string Name { get; set; }

    [StringLength(150)]
    public string Description { get; set; }

    public int CreatedById { get; set; }
    public virtual UserProfile CreatedBy { get; set; }

    [Required]
    public DateTimeOffset CreatedDate { get; protected set; }       
}


public class Comment : EntityBase<int>
{
    [StringLength(200)]
    public string Text { get; set; }

    public int CreatedById { get; set; }
    public virtual UserProfile CreatedBy { get; set; }

    [Required]
    public DateTimeOffset CreatedDate { get; protected set; }
}

SQLでクエリがどのように表示されるかについての私の気持ちは次のとおりです。

WITH NewsFeed AS (
SELECT 
    g.Id AS ItemId
    ,'Group' AS ItemType
    ,g.GroupName AS HeaderText
    ,g.CreatedDate
    ,g.CreatedById AS CreatorId
    ,u.UserName AS CreatorName
FROM Groups g
    INNER JOIN UserProfiles u on g.CreatedById = u.Id

UNION 

SELECT 
    a.Id AS ItemId
    ,'Activity' AS ItemType
    ,a.Name AS HeaderText
    ,a.CreatedDate
    ,a.CreatedById AS CreatorId
    ,u.UserName
FROM Activities a
    INNER JOIN UserProfiles u on a.CreatedById = u.Id

UNION 

SELECT 
    c.Id AS ItemId
    ,'Comment' AS ItemType
    ,c.Text AS HeaderText
    ,c.CreatedDate
    ,c.CreatedById AS CreatorId
    ,u.UserName
FROM Comments c
    INNER JOIN UserProfiles u on c.CreatedById = u.Id
) 
SELECT TOP 10 *
    FROM NewsFeed
    ORDER BY CreatedDate
4

1 に答える 1

5

投影を使用する必要があります。各単一クエリの結果を、同じパラメーターを持つ匿名(または匿名ではない)オブジェクトに投影するだけです(名前とタイプは一致する必要があります)。次に、次のようなことを行うことができます。

var query =
    context.SetOne.Select(x => new { Key = x.ID })
        .Union(context.SetTwo.Select(x => new { Key = x.AnotherKey }))
        .Union(context.SetThree.Select(x => new { Key = 5 }));
于 2013-01-14T14:06:11.413 に答える