我有4个表:帖子,类别,关系和元
category
可以包含多个posts
,它们之间的关系存储在Relation
表中。然后,帖子可以包含许多存储在Meta
表中的额外信息。我想列出所有带有类别和额外信息的帖子,然后按照帖子的ID对它们进行分组。
我有以下查询
select p.ID, p.Title, t.Name, m.Key, m.Value from Post p
left join Relation r on p.ID = r.Child
left join Category c on r.Parent = c.ID
left join Meta m on p.ID = m.Object
where m.Type = 'news'
order by p.ID
以及这些样本数据:
Post
ID Title
1 A
Category
ID Name
1 Tips
2 Tricks
Meta
ID Object Key Value
1 1 Key1 Value 1
2 1 Key2 Value 2
Relation
ID Child Parent
1 1 1
2 1 2
然后结果将是
PostID Title Category Key Value
1 A Tips Key1 Value1
1 A Tips Key2 Value2
1 A Tricks Key1 Value1
1 A Tricks Key2 Value2
我希望结果是
PostID Title Categories Meta
1 A Tips, Tricks Key1=Value1, Key2=Value2
我想知道我们是否可以使用EF v4将查询从SQL转换为LINQ to Entities
,结果存储在这样的类中
class Result
{
long ID,
string Title,
List<string> Categories,
Dictionary<string, string> Meta
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
您对查询的最终结果是什么? 我个人更喜欢编写像
这样的查询 var q = from r in Relation
join p in Post on r.Child equals p.ID
join t in Term on r.Parent equals t.ID
let x = new { p.ID, p.Title, t.Name }
group x by x.ID into g
select g;
这种方式我认为(不确定)生成的sql会更简单
答案 1 :(得分:1)
既然您想要使用EntityFramework,您只需要设置数据库,edmx,其中Result表包含ID和Title,然后是Category和Meta表。然后将Result表中的一对多关系添加到Category和Meta表中。
答案 2 :(得分:0)
我不是100%确定你要做什么,但显然如果你要分组,结果必须按结果集中的任何内容进行分组,或者是聚合数据。此查询将通过PostId,PostTitle和CategoryName检索结果和分组,生成单个SQL语句:
var query = from p in Posts
from r in Relations
.Where(r => p.ID == r.Child)
.DefaultIfEmpty()
from c in Categories
.Where(c => r.Parent == c.ID)
.DefaultIfEmpty()
group p by new {ID = p.ID, Title = p.Title, Name = c.Name} into z
select new { ID = z.Key.ID, Title = z.Key.Title, Name = z.Key.Name };
以下是此声明生成的SQL:
SELECT [t3].[ID], [t3].[Title], [t3].[value] AS [Name]
FROM (
SELECT [t0].[ID], [t0].[Title], [t2].[Name] AS [value]
FROM [Post] AS [t0]
LEFT OUTER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child]
LEFT OUTER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID]
) AS [t3]
GROUP BY [t3].[ID], [t3].[Title], [t3].[value]
以下是您原始声明生成的SQL:
SELECT [t0].[ID] AS [Key]
FROM [Post] AS [t0]
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child]
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID]
GROUP BY [t0].[ID]
GO
-- Region Parameters
DECLARE @x1 Int SET @x1 = 1
-- EndRegion
SELECT [t0].[ID], [t0].[Title], [t2].[Name]
FROM [Post] AS [t0]
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child]
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID]
WHERE ((@x1 IS NULL) AND ([t0].[ID] IS NULL)) OR ((@x1 IS NOT NULL) AND ([t0].[ID] IS NOT NULL) AND (@x1 = [t0].[ID]))
GO
-- Region Parameters
DECLARE @x1 Int SET @x1 = 2
-- EndRegion
SELECT [t0].[ID], [t0].[Title], [t2].[Name]
FROM [Post] AS [t0]
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child]
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID]
WHERE ((@x1 IS NULL) AND ([t0].[ID] IS NULL)) OR ((@x1 IS NOT NULL) AND ([t0].[ID] IS NOT NULL) AND (@x1 = [t0].[ID]))