我正在嘗試從Device表格中獲取針對當前客戶的設備串列。我做到了,但使用了foreach回圈,但我想改用 linq 進行操作。
這是我的班級結構
public class Device
{
public string type { get; set; }
public int id { get; set; }
public List<Role> roles { get; set; }
}
public class Role
{
public int roleId { get; set; }
public string roleName { get; set; }
public int customerId { get; set; }
}
這是我的代碼
var devList = list.Where(x => x.type == "device1").ToList();
foreach (var item in devList)
{
if (item.roles != null)
{
var kss = item.roles.Where(z => z.customerId == kunId).FirstOrDefault();
if (kss != null)
{
m.devicesList.Add(item);
}
}
}
我需要針對當前客戶獲取設備,因此我必須將當前用戶 ID 與customerId.
如何將其轉換為 linq-to-sql?
uj5u.com熱心網友回復:
有兩種方法可以解決這個問題。
首先,您可以將所有內容放入一個復雜的Where操作中:
var devices = list.Where(d => d.type == "device1" && d.roles is object && d.roles.Any(r => r.customerId == kunId) );
其次,您可以將其分散到多個單獨的操作中,但每個操作都更容易理解:
var devices = list.Where(d => d.type == "device1").
Where(d => d.roles is object).
Where(d => d.roles.Any(r => r.customerId == kunId) );
任一選項的性能都相似。額外的Where()呼叫有開銷,但沒有你想象的那么多...... JITter 可以用這種代碼做一些驚人的事情,我不會驚訝地看到這兩個最終都完全相同伊利諾伊州。
另請注意,在這兩種情況下都沒有ToList()呼叫。通過堅持IEnumerable更長時間,您通常可以大大提高性能和記憶體使用率。
在這一點上,我不清楚您是否只是附加到現有m.devicesList值中,或者這些值是否可以替換該集合中當前可能存在的任何值。
假設m.devicesList宣告為List<Device>(或類似的),前一個選項將如下所示:
m.devicesList.AddRange(devices);
再次,有沒有必要不斷打電話ToList()。
后者看起來像這樣:
m.devicesList = devices.ToList();
我們也可以將兩個步驟合并為一個陳述句。這是四種可能的組合之一:
m.devicesList.AddRange(list.Where(d => d.type == "device1").
Where(d => d.roles is object).
Where(d => d.roles.Any(r => r.customerId == kunId) )
);
uj5u.com熱心網友回復:
所以你有一個物件kunId,它與Role.CustomerId. 您還有一個Itemsin object序列devList。最后,你還有一個屬性m.DevicesList,它實作了ICollection<Item>(=你有一個方法Add(Item))
您當前的方法檢查Item您的專案序列中的每一個。如果 propertyRoles為 null,則忽略該 Item。另一方面,如果您有一些角色,您將獲得第一個或默認角色,其屬性值CustomerId等于 kunId。如果有這樣的非默認角色,那么您將 Item 添加到m.DevicesList.
我會重新表述這個要求。
當且僅當 anItem的 property 具有非空值Roles,并且這些角色中至少有一個具有等于 的屬性 CustomerId 的值kunId,然后您將該 Item 添加到 Items 的序列中m.DevicesList
var itemsToAddToMDevicesList = devList.Where(item =>
item.Roles != null &&
item.Roles.Where(role => role.CustomerId == kunId).Any();
換句話說:Items您要添加到m.DeviceList的序列是所有Itemsin的序列,其中property具有devList非空值Roles,并且至少有一個Rolein propertyRoles其屬性 CustomerId 的值等于kunId。
uj5u.com熱心網友回復:
始終嘗試首先用簡單的自然語言“實作”您的要求。
你需要什么設備?那些:
- 型別為“device1”
- 為給定的客戶分配了角色
分別構建每個部分,添加必要的守衛,例如roles != null,你會得到這樣的東西:
var devicesFound = list.Where(d =>
d.type == "device1" &&
d.roles != null &&
d.roles.Any(r => r.customerId == kunId));
m.devicesList.AddRange(devicesFound);
uj5u.com熱心網友回復:
您應該能夠洗掉分配給 devList 的 linq 運算式值末尾的 .ToList()。
此外,如果您的目標是優化您正在執行的操作,您可能會考慮維護當前代碼,而不是將其轉換為 linq 運算式。
不過,如果您需要轉換 foreach 回圈,請查看microsoft 官方檔案,您應該可以在智能感知的幫助下自動完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366473.html
上一篇:從另一個排序串列創建過濾串列
