簡體   English   中英

我正在嘗試從未使用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

“我想要一個用戶列表”,意味着您需要滿足謂詞的每個用戶的NameUserIdFK

雖然你沒有這么說,我猜User是由UserIdFK而不是他的名字來識別的:兩個不同的用戶都可以使用相同的名字“John Doe”。

為了查詢結果,我創建了具有UserIdFk相同值的訂單組。 分組后,我放棄所有具有任何真正價值的屬性Authorized 從剩下的組中我獲取UserIdFkName

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM