我是 linq 和物體框架的新手,希望得到您的幫助
我在 sql 中有 3 個表,我希望從中組合資料
查詢表——有userId加入用戶表
用戶表 --- 只需要用戶資料,例如。此表中用于查詢的用戶名 - 這始終是單一的
docs 表——它有 queryId 來加入 queryTable 也沒有必要每個查詢都應該有一個檔案,這就是為什么這里的連接被留在外面,因為我仍然想要沒有檔案的查詢,而且查詢也有可能有多個檔案
我的 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",
}]
}
uj5u.com熱心網友回復:
這是 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()
};
還可以考慮廣泛使用導航屬性。在這種情況下,不需要顯式連接到用戶表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431546.html
