通过与其他列表中的属性匹配的属性过滤列表
问题描述:
该任务非常简单。鉴于发票清单和账户清单,我需要过滤前者,只保留那些与他们有关的活动账户。它应该表现如下的一个例子。通过与其他列表中的属性匹配的属性过滤列表
发票:{ “一”,1},{ “B”,2},{ “C”,3},{ “d”,4}
账户:{ “一”,100} { “C”,101}
结果:{ “A”,1},{ “C”,3}
我解决它使用包含但它未能对不能够在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以及数据库如何运行的问题,可以采取什么措施来提高以下请求中的工作速度?最好,我希望数据库通过LINQ的魔力来处理它。
答
使用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();
你应该能够做到'发票= invoices.Where(发票=> datas.Select(数据=> data.Id)。载(invoice.Id))ToList();'。在尝试时出现什么错误?另外,什么'datas'?它是如何声明的? – MarcinJuraszek
错误消息是“*底层提供程序在Open。上失败”,内部说该操作在事务的当前状态中无效。变量* datas *是一个拥有类型为* Guid *的属性的类。只是SQL中表的表示。 –
你正在调用'Select',所以它必须是一个集合。它是如何声明的?尝试直接使用'context'。 – MarcinJuraszek