我的关注基于 same question我之前问过并得到了解决方案。
我最初以为我得到了正确的回应,但事实并非如此。我的数据是这样的:
如果我这样过滤
var result = overdues.Where(a=>a.Accounts.Any(b=>b.AccountId.Equals("JKB2")));
我得到的结果是这样的:
但我希望结果只包含等于 JKB2 的帐户,而不是包含 JKB2 的帐户。因此,我在此处强调的内容应该出现在结果中,而不是其他内容:
从技术上讲,结果应该是这样的(我只是写了一个JSON形式的伪代码):
[
{
Slab: T3,
Value: 500,
Percentage: 0
Accounts: {
AccountId:JKB2,
AccountName:JKB2,
SalesCode:JKB,
Value:500
}
},
{
Slab: T5,
Value: 500,
Percentage: 0
Accounts: {
AccountId:JKB2,
AccountName:JKB2,
SalesCode:JKB,
Value:500
}
}
]
我的 LinqPad 工作在这里:
public class OverdueModel
{
public string Slab { get; set; }
public double Value { get; set; }
public double Percentage { get; set; }
public List<OverdueSlabAccounts> Accounts { get; set; }
}
public class OverdueSlabAccounts
{
public string AccountId { get; set; }
public string AccountName { get; set; }
public string SalesCode { get; set; }
public string Value { get; set; }
}
void Main(){
List<OverdueModel> overdues = new List<OverdueModel>();
List<OverdueSlabAccounts> accounts1 = new List<OverdueSlabAccounts>();
List<OverdueSlabAccounts> accounts2 = new List<OverdueSlabAccounts>();
List<OverdueSlabAccounts> accounts3 = new List<OverdueSlabAccounts>();
//For T3
accounts1.Add(new OverdueSlabAccounts()
{
AccountId = "JKB1",
AccountName = "JKB1",
SalesCode = "JKB",
Value = "500"
});
accounts1.Add(new OverdueSlabAccounts()
{
AccountId = "JKB2",
AccountName = "JKB2",
SalesCode = "JKB",
Value = "500"
});
overdues.Add(new OverdueModel()
{
Slab = "T3",
Value = 1000,
Percentage = 0,
Accounts= accounts1
});
//For T4
accounts2.Add(new OverdueSlabAccounts()
{
AccountId = "JKB1",
AccountName = "JKB1",
SalesCode = "JKB",
Value = "1000"
});
overdues.Add(new OverdueModel()
{
Slab = "T4",
Value = 1000,
Percentage = 0,
Accounts= accounts2
});
//For T5
accounts3.Add(new OverdueSlabAccounts()
{
AccountId = "JKB1",
AccountName = "JKB1",
SalesCode = "JKB",
Value = "1000"
});
accounts3.Add(new OverdueSlabAccounts()
{
AccountId = "JKB2",
AccountName = "JKB2",
SalesCode = "JKB",
Value = "500"
});
accounts3.Add(new OverdueSlabAccounts()
{
AccountId = "JKB3",
AccountName = "JKB3",
SalesCode = "JKB",
Value = "500"
});
overdues.Add(new OverdueModel()
{
Slab = "T5",
Value = 2000,
Percentage = 0,
Accounts= accounts3
});
//Show the Current Data
overdues.Dump();
var result = overdues.Where(a=>a.Accounts.Any(b=>b.AccountId.Equals("JKB2")));
result.Dump();
}
最佳答案
过滤器是正确的,因为它返回 有 记录的 OverdueModel
实例;问题是您只需要内部 .Accounts
的过滤部分。如果我们假设我们不想更改所有对象,您将需要创建一个到新模型的投影,该新模型仅包含那些已过滤的帐户.也许是这样的:
var results = from outer in overdues
where outer.Accounts.Any(b => b.AccountId == "JKB2")
let filtered = outer.Accounts.FindAll(b => b.AccountId == "JKB2")
select (Record: outer, Accounts: filtered);
尽管有多种选择是可能的。例如,一个更扁平的模型是:
var results = from outer in overdues
from account in outer.Accounts
where account.AccountId == "JKB2"
select (Record: outer, Account: account);
关于c# - 从 List<T> 的 List<T> 筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134934/