在這個例子中,我有一個下表,其中有一列“受限訪問”。我有另一個包含訪問資訊的表。使用 linq 加入下表的最佳方法是什么?
我有我們稱之為報告的主表
報告
| ID | 報告 | 是受限的 |
|---|---|---|
| 1 | 一種 | 0 |
| 2 | 乙 | 1 |
| 3 | C | 1 |
我有第二個表,我們稱之為 Access
使用權
| ID | 公司 | 報告 |
|---|---|---|
| 1 | 谷歌 | 乙 |
| 2 | 字母 | C |
在代碼中,我想創建一個具有以下條件的串列:
- 如果 isRestricted 為 0,它將顯示任何試圖訪問的公司
- 如果 isRestricted 為 1,則僅在當前公司的訪問表中有條目時才顯示該報告
因此對于
var currentCompany = “google”;
我希望一個串列回傳報告“a”和“b”。
我將如何使用 linq 完成此操作?
uj5u.com熱心網友回復:
假設您已將導航屬性全部正確連接(報告具有 ICollection of Access)等,您可以詢問:
var q = context.Reports.Where(r => r.IsRestricted == 0 || r.Accesses.Any(a => a.Company == currentCompany))
EF 將進行必要的連接等。如果您正在使用 EF5 并想查看它撰寫的 SQL,請在運行 Where 后暫停除錯器并查看 Q 變數的 DebugView 屬性。我認為這個變成了一個只對谷歌的子查詢的左連接,要求左連接不為空(但很難記住它們是如何翻譯的)
如果您還沒有在模型中的表之間建立任何關系,它可能需要看起來更像:
var q = context.Reports.Where(r => r.IsRestricted == 0 || context.Accesses.Any(a => r.Report == a.Report && a.Company == currentCompany))
這將變成一個 sql,它使用協調的 EXISTS 來檢查該公司是否存在于該報告的 Accesses 表中
在任何一種情況下,我認為 DB 可能會以類似的方式計劃和執行查詢,但是如果您知道哪個性能更好,您將不得不賽跑!
uj5u.com熱心網友回復:
如果我們從普通物件開始,我們可以這樣做:
using System;
using System.Linq;
public class Program
{
public static void Main()
{
var reports = new []
{
new { Id = 1, Report = "a", IsRestricted = 0 },
new { Id = 2, Report = "b", IsRestricted = 1 },
new { Id = 3, Report = "c", IsRestricted = 1 }
};
var accesses = new []
{
new { Id = 1, Company = "google", Report = "b" },
new { Id = 2, Company = "alphabet", Report = "c" }
};
var currentCompany = "google";
var list = reports
.Where(r => r.IsRestricted == 0)
.Select(r => r.Report)
.Concat(accesses
.Where(a => a.Company == currentCompany)
.Select(a => a.Report)
)
.Distinct()
.ToList();
System.Console.WriteLine(list.Aggregate((a, b) => a "," b));
}
}
這將列印a,b.
由于您的問題集中在 LINQ 上,我認為如果您可以在從資料庫讀取和操作記錄后提供視圖/資料結構/背景關系,這將有助于其他人回答您的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331426.html
