我如何 return 来自主 table 的单个数据和第二个 table 中的多个条目嵌套在加入后
How do I return single data from primary table and multiple entries in second table nested after join
我是 linq & entity framework 的新手,希望得到您的帮助
我在 sql 中有 3 个 table,我希望从中合并数据
query table -- 有加入用户的userId table
user table --- 只需要用户数据,例如。来自此 table 的查询用户名 -- 这始终是单个用户名
docs table -- 它有 queryId 来连接 queryTable 也没有必要每个查询都应该有一个 doc 这就是为什么这里连接留在外面因为我仍然想要查询没有文档的地方,也有可能一个查询可以有多个文档
我的 linq 查询就是这样
var result = (from q in queryTable
join u in userTable on q.userId equals u.Id
join doc in docTable on q.Id equals doc.queryId into qdoc
from doc in qdoc.DefaultIfEmpty()
select new {
Id = q.Id,
Text = q.Text,
User = u.UserName,
Doc = doc == null ? null : new {DocId = doc.Id, DocName = doc.DocumentName}
})
现在,如果一个查询只有一个文档,上面的查询就可以工作了,但是如果一个查询有多个文档,它会为该查询提供 2 个条目
现在假设我有 3 个查询 ID 1,2,3 对于 id=1 有一个文档,对于 id=2 有两个文档而对于 id=3 没有文档
当我在上面 运行 查询 id=1 时,输出是这样的
{
"id": 1,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 2,
"docName": "pictue.png",
}
}
对于 id=3 没有文档
{
"id": 3,
"text": "Some text of query",
"user": "Username",
"doc": null
}
问题是当 id=2 时,因为有 2 个文档,它给了我 2 个我不想要的条目
-- 我得到的输出 --
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 3,
"docName": "pictue.png",
},
},
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 4,
"docName": "pictue.png",
}
}
预期输出---
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": [{
"docId": 3,
"docName": "pictue.png",
},
{
"docId": 4,
"docName": "pictue.png",
}]
}
这是 JOIN 的正常行为,它会乘以结果集。但是 EF 已经实现了 Eager Loading,它可以对最终结果集的实体进行分组。
var result =
from q in queryTable
join u in userTable on q.userId equals u.Id
select new
{
Id = q.Id,
Text = q.Text,
User = u.UserName,
Doc = docTable.Where(doc => doc.queryId == q.Id)
.Select(doc => new { DocId = doc.Id, DocName = doc.DocumentName })
.ToArray()
};
同时考虑广泛使用导航属性。在这种情况下,将不需要显式加入用户 table。
我是 linq & entity framework 的新手,希望得到您的帮助
我在 sql 中有 3 个 table,我希望从中合并数据
query table -- 有加入用户的userId table
user table --- 只需要用户数据,例如。来自此 table 的查询用户名 -- 这始终是单个用户名
docs table -- 它有 queryId 来连接 queryTable 也没有必要每个查询都应该有一个 doc 这就是为什么这里连接留在外面因为我仍然想要查询没有文档的地方,也有可能一个查询可以有多个文档
我的 linq 查询就是这样
var result = (from q in queryTable
join u in userTable on q.userId equals u.Id
join doc in docTable on q.Id equals doc.queryId into qdoc
from doc in qdoc.DefaultIfEmpty()
select new {
Id = q.Id,
Text = q.Text,
User = u.UserName,
Doc = doc == null ? null : new {DocId = doc.Id, DocName = doc.DocumentName}
})
现在,如果一个查询只有一个文档,上面的查询就可以工作了,但是如果一个查询有多个文档,它会为该查询提供 2 个条目
现在假设我有 3 个查询 ID 1,2,3 对于 id=1 有一个文档,对于 id=2 有两个文档而对于 id=3 没有文档
当我在上面 运行 查询 id=1 时,输出是这样的
{
"id": 1,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 2,
"docName": "pictue.png",
}
}
对于 id=3 没有文档
{
"id": 3,
"text": "Some text of query",
"user": "Username",
"doc": null
}
问题是当 id=2 时,因为有 2 个文档,它给了我 2 个我不想要的条目
-- 我得到的输出 --
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 3,
"docName": "pictue.png",
},
},
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": {
"docId": 4,
"docName": "pictue.png",
}
}
预期输出---
{
"id": 2,
"text": "Some text of query",
"user": "Username",
"doc": [{
"docId": 3,
"docName": "pictue.png",
},
{
"docId": 4,
"docName": "pictue.png",
}]
}
这是 JOIN 的正常行为,它会乘以结果集。但是 EF 已经实现了 Eager Loading,它可以对最终结果集的实体进行分组。
var result =
from q in queryTable
join u in userTable on q.userId equals u.Id
select new
{
Id = q.Id,
Text = q.Text,
User = u.UserName,
Doc = docTable.Where(doc => doc.queryId == q.Id)
.Select(doc => new { DocId = doc.Id, DocName = doc.DocumentName })
.ToArray()
};
同时考虑广泛使用导航属性。在这种情况下,将不需要显式加入用户 table。