![](/img/trans.png)
[英]Best way to compare two classes (Users and Holidays) and create a list of Users who have not created an instance of the Holiday class with LINQ
[英]I am trying create a new list of users from a list of users who have not created an additional object with a certain property using LINQ
真的很抱歉這個問題的措辭。
我試圖使用LINQ解決一個場景,但我似乎無法弄明白。
我正在嘗試從不同的列表創建用戶列表,其中不存在具有特定屬性值的其他用戶對象。
例如,我有一個訂單列表,每個訂單都有一個授權的財產。
IList<Order> orderlist = new List<Order>() {
new Order () { Name = "James", UserIDFK = "1", Authorized = false},
new Order () { Name = "James", UserIDFK = "1", Authorized = true},
new Order () { Name = "Ryan", UserIDFK = "2", Authorized = false},
new Order () { Name = "Pete", UserIDFK = "3", Authorized = false},
new Order () { Name = "Pete", UserIDFK = "3", Authorized = false},
我正在嘗試從沒有其他對象並且Authorized屬性設置為“true”的用戶的訂單列表中創建ID列表。
例如,我不想將James添加到此列表中,因為列表中存在授權訂單。
但是,我想將Ryan和Pete添加到列表中,因為沒有具有其外鍵的對象已經被授權。
我試圖使用:
notauthorised = orderlist.Where(y => ! orderlist.All(z => z.Authorised ==
false)).ToList();
據我所知,這是一次非常糟糕的嘗試。 有一個更好的方法嗎?
非常感謝你的幫助,我真的很感激
您可以按UserIDFK
(或按Name
)進行分組,然后僅選擇所有Authorized
為false的組
IList<Order> orderlist = new List<Order>() {
new Order () { Name = "James", UserIDFK = "1", Authorized = false},
new Order () { Name = "James", UserIDFK = "1", Authorized = true},
new Order () { Name = "Ryan", UserIDFK = "2", Authorized = false},
new Order () { Name = "Pete", UserIDFK = "3", Authorized = false},
new Order () { Name = "Pete", UserIDFK = "3", Authorized = false},
};
var result = orderlist
.GroupBy(o => o.UserIDFK)
.Where(g => g.All(x => !x.Authorized)) // will exclude James
.Select(g => g.First());
我正在嘗試創建用戶列表...其中不存在具有特定屬性值的其他用戶對象。
根據您的描述,我認為“財產價值不存在”意味着Authorized
財產具有虛假價值。
因此,我認為您希望所有不具有真正屬性值的不同用戶Authorized
。
“我想要一個用戶列表”,意味着您需要滿足謂詞的每個用戶的Name
和UserIdFK
。
雖然你沒有這么說,我猜User
是由UserIdFK
而不是他的名字來識別的:兩個不同的用戶都可以使用相同的名字“John Doe”。
為了查詢結果,我創建了具有UserIdFk
相同值的訂單組。 分組后,我放棄所有具有任何真正價值的屬性Authorized
。 從剩下的組中我獲取UserIdFk
和Name
// Make groups of Orders with same [UserIdFk, Name]
var usersWithoutAuthorization = orders.GroupBy(
// KeySelector: make groups of Orders with same UserIdFk value
order => order.UserIdFk,
// ResultSelector: from the UserIdFk and all Orders with this UserIdFk
(userIdFk, ordersWithThisUserIdFk) => new
{
UserId = userIdFk,
Name = ordersWithThisUserIdFk.Select(order => order.Name).FirstorDefault(),
HasAnyAuthorized = ordersWithThisUserIdFk
.Select(order => order.Authorized)
.Any(),
})
// keep only the users that have not any authorized
.Where(groupResult => !groupResult.HasAnyAuthorized);
如果需要,可以添加額外的Select來擺脫HasAnyAuthorized
。 我的建議是不要使用這個屬性。 這個額外的Select只會減慢您的查詢速度,除非您從其他進程(如數據庫管理系統)獲取它。
如果您使用GroupBy [userIdFk,Name],您的ResultSelector將更容易,但它可能會更慢,因為它還會比較名稱是字符串,當然比整數UserIdFk
更慢比較
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.