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