我正在嘗試在 EF Core 中復制一條 SQL 陳述句,但似乎找不到一種方法來設定場景我有以下表結構
Slot -> SlotInstance -> SlotInstanceUser(一個Slot可以有很多SlotInstance,一個SlotInstance可以有很多SlotInstanceUser)
當用戶注冊 SlotInstance 時,會在 SlotInstanceUsers 中創建一條記錄,存盤 SlotInstanceId 和 UserId - 一切都很好。
我可以撰寫 SQL 來獲取用戶尚未注冊的插槽實體串列,例如
SELECT
S.StartDate, S.EndDate, S.StartTime, S.EndTime, S.DayOfWeek,
SI.Date
FROM
Slot S WITH (NOLOCK)
INNER JOIN
SlotInstance SI WITH (NOLOCK) ON S.Id = SI.SlotId
WHERE
SI.ID not in (
SELECT
SlotInstanceId
FROM
SlotInstanceUser SIU WITH (NOLOCK)
WHERE
SIU.UserId = @UserID
)
ORDER BY
SI.Date
但我似乎無法在 EF 核心中復制它——我錯過了什么?
uj5u.com熱心網友回復:
您可以使用與 SQL 查詢幾乎相同的方式撰寫 LINQ 查詢。請記住,在 LINQselect中,變數(別名)是必需的,SQL 的等價物NOT IN是!Contains. 例如
var query =
from s in db.Slots
join si in db.SlotInstances on s.Id equals si.SlotId
where !(from siu in db.SlotInstanceUsers
where siu.UserId == userId)
select siu.SlotInstanceId).Contains(si.Id)
orderby si.Date
select new
{
s.StartDate, s.EndDate, s.StartTime, s.EndTime, s.DayOfWeek,
si.Date
};
但是在 EF Core 中,您有更多選擇,尤其是對于聯接,因為通常關系(和關聯的聯接)是使用導航屬性封裝的。因此,您使用 EF Core/C# 術語描述的模型類似于
public class Slot
{
public int Id { get; set; }
// Other properties...
public ICollection<SlotInstance> SlotInstances { get; set; }
}
public class SlotInstance
{
public int Id { get; set; }
// Other properties...
public Slot Slot { get; set; }
public ICollection<SlotInstanceUser> SlotInstanceUsers { get; set; }
}
public class SlotInstanceUser
{
public int Id { get; set; }
// Other properties...
public SlotInstance SlotInstance { get; set; }
}
查詢就像
var query =
from s in db.Slots
from si in s.SlotInstances
where !si.SlotInstanceUsers.Any(siu => siu.UserId == userId)
orderby si.Date
select new
{
s.StartDate, s.EndDate, s.StartTime, s.EndTime, s.DayOfWeek,
si.Date
};
(這實際上轉換為 SQL NOT EXISTS,但這不是必需的)。
如果您不需要投影,而只是用戶尚未注冊的插槽實體(帶有插槽資訊),那么它很簡單
var query = db.SlotInstances
.Include(si => si.Slot)
.Where(si => !si.SlotInstanceUsers.Any(siu => siu.UserId == userId))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462706.html
上一篇:如何將具有這種格式(yyyy-MM-ddHH:mm:ss)的字串形式的日期轉換為這種格式的DateTime物件(dd-MM-yyyyHH:mm:ss)
