任务非常简单。给定发票列表和帐户列表,我需要过滤前者,只保留那些与其相关的活动帐户。它应该表现如下的一个例子。
发票:{“a”,1},{“b”,2},{“c”,3},{“d”,4}
帐户:{“a”,100},{“c”,101}
结果:{“a”,1},{“c”,3}
我使用 Contains 解决了它,但是在EF无法执行这样复杂的查询时失败了(还有其他条件,而且EF也可能没有正确设置)。然后我尝试获取所有数据并在客户端上进行过滤,但是在异常溢出时失败并且非常缓慢。
通过试验和恐怖平衡代码质量与性能的一夜之后,我不理解奇怪的异常(是的,谷歌给了很多,但没有让我更明智)并且无法做任何事情(预先我现在已经接受了以下代码。
List<Guid> guids = datas.Select(data => data.Id).ToList();
List<Invoice> invoices = context.Invoices
.Where(invoice => condition_00)
...
.Where(invoice => condition_99).ToList();
invoices = invoices.Where(invoice => guids.Any(guid => invoice.Id == guid)).ToList();
坦率地说,我对这些步骤并不满意,我认为正确的方法是在一次打击中执行整个操作。假设我们不允许讨论如何设置EF以及数据库的行为方式,是否可以改进任何内容以便在以下请求中更快地运行?最好是,我希望DB能够通过LINQ的魔力来处理它。
答案 0 :(得分:0)
使用JOIN怎么样?
List<List<object>> Invoices = new List<List<object>>() {
new List<object>(){"a", 1},
new List<object>(){"b", 2},
new List<object>(){"c", 3},
new List<object>(){"d", 4}
};
List<List<object>> Accounts = new List<List<object>>() {
new List<object>(){"a", 100},
new List<object>(){"c", 101}
};
var results = (from invoices in Invoices
join accounts in Accounts on invoices[0] equals accounts[0]
select new { name = invoices[0], id = invoices[1], total = accounts[1] })
.ToList();