請考慮以下表格:
用戶:
UserId Name LastName
--------------------------------
User1 Name1 LName1
User2 Name2 LName2
User3 Name3 LName3
User4 Name4 LName4
和用戶登錄日志:
UserId LogDate Status
--------------------------------
User1 2022-01-01 1 <--For Successful Login
User1 2022-01-02 0 <--For UnSuccessful Login
User2 2022-01-02 1
User4 2022-02-02 1
User4 2022-03-02 0
User4 2022-05-02 1
User4 2022-05-10 0
User5 2022-05-10 0
不,我想找到那些沒有在特定時間段內登錄的用戶(例如過去一個月)。從另一個角度來看,我不希望至少有一個Successful登錄的用戶在特定的持續時間內登錄。
我寫了一些查詢,但我無法檢查排除至少有一個Successful登錄日志的記錄。這是查詢的一個SQL版本Linq:
select *
from Users aa left join Login_Log bb on aa.UserId = bb.UserId
where (bb.LogDate >= DATEADD(month, -1, getdate()) and bb.LogDate <= getdate()) and bb.Status is null
uj5u.com熱心網友回復:
LogedInUsers CTE 的用戶至少有一次成功登錄。然后最終結果是不在 CTE 中的用戶:
WITH LogedInUsers
AS (SELECT DISTINCT bb.UserId
FROM Login_Log bb
WHERE bb.LogDate >= DATEADD(MONTH, -1, GETDATE())
AND bb.LogDate <= GETDATE()
AND bb.Status = 1
)
SELECT aa.*
FROM Users aa
LEFT JOIN LogedInUsers liu ON aa.UserId = liu.UserId
WHERE liu.UserId IS NULL;
uj5u.com熱心網友回復:
我不希望至少有一次成功登錄的用戶在特定持續時間內登錄。
DateTime startPeriod = ...
DateTime endPeriod = ...
IEnumerable<UserLogin> userLogins == ...
IEnumerable<User> Users = ...
要求給我所有在 startPeriod 和 endPeriod 之間的時間段內沒有成功登錄的用戶。
首先,我們獲取在此期間至少有一次成功登錄的所有用戶的 UserId
IEnumerable<UserId> idsOfSuccessfulUserLoginDuringPeriod = userLogins
// only the succesful UserLogins during period:
.Where(userLogin => userLogin.Status == 1
&& startPeriod <= userLogin.LogDate
&& userLogin.LogData <= endPeriod)
// select only the UserIds
.Select(userLogin => userLogin.UserId)
// and remove duplicates
.Distinct();
換句話說:從所有登錄嘗試中,僅保留此期間的成功嘗試。從剩余的 UserLogins 中選擇 UserId,然后洗掉重復項。
如果 userId 是參考型別,則不能在 中使用默認的相等比較器Distinct,您必須提供按值比較的參考型別。
現在洗掉在此期間成功登錄的所有用戶:
IEnumerable<User> usersThatHadNoSuccessfulLoginDuringPeriod = users.
.Where(user => !idsOfSuccessfulUserLoginDuringPeriod.Contains(user.UserId));
換句話說:要獲取在此期間沒有成功登錄的所有用戶,請從所有用戶開始,并僅保留那些其 UserId不在此期間成功登錄的用戶的 UserIds 集合中的用戶。
當然,您可以將它寫在一個大的 LINQ 陳述句中。這不會提高效率。我相信它會降低可讀性。
簡單的來吧您好!
uj5u.com熱心網友回復:
您可以在 User 表中選擇 ID 在上個月沒有成功登錄的用戶。這是linq格式的解決方案:
var dormientUsers = from u in users
where !(from ul in userLoginLogs
where ul.Status && ul.LogDate >= DateTime.Now.AddMonths(-8) && ul.LogDate <= DateTime.Now
select ul.UserId)
.Contains(u.UserId)
select u;
該解決方案假定以下定義:
public class User{
public string UserId { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
}
public class UserLoginLog{
public string UserId { get; set; }
public DateTime LogDate { get; set; }
public bool Status { get; set; }
}
users和分別是和userLoginLogs的串列。例如,根據問題中的示例資料:UserUserLoginLog
IList<User> users = new List<User>() {
new User() { UserId = "User1", Name = "Name1", LastName = "LName1"} ,
new User() { UserId = "User2", Name = "Name2", LastName = "LName2"} ,
new User() { UserId = "User3", Name = "Name3", LastName = "LName3"} ,
new User() { UserId = "User4", Name = "Name4", LastName = "LName4"} ,
new User() { UserId = "User5", Name = "Name5", LastName = "LName5"} ,
};
IList<UserLoginLog> userLoginLogs = new List<UserLoginLog>() {
new UserLoginLog() { UserId = "User1", LogDate = new DateTime(2022, 1, 1), Status = true} ,
new UserLoginLog() { UserId = "User2", LogDate = new DateTime(2022, 1, 2), Status = false} ,
new UserLoginLog() { UserId = "User4", LogDate = new DateTime(2022, 1, 2), Status = true} ,
new UserLoginLog() { UserId = "User4", LogDate = new DateTime(2022, 1, 2), Status = true} ,
new UserLoginLog() { UserId = "User1", LogDate = new DateTime(2022, 1, 2), Status = false} ,
new UserLoginLog() { UserId = "User4", LogDate = new DateTime(2022, 1, 2), Status = true} ,
new UserLoginLog() { UserId = "User4", LogDate = new DateTime(2022, 5, 10), Status = false} ,
new UserLoginLog() { UserId = "User5", LogDate = new DateTime(2022, 5, 10), Status = false} ,
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515620.html
標籤:C#sql林克链接到实体
