2015-07-19 112 views
0

该任务非常简单。鉴于发票清单和账户清单,我需要过滤前者,只保留那些与他们有关的活动账户。它应该表现如下的一个例子。通过与其他列表中的属性匹配的属性过滤列表

发票:{ “一”,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的魔力来处理它。

+0

你应该能够做到'发票= invoices.Where(发票=> datas.Select(数据=> data.Id)。载(invoice.Id))ToList();'。在尝试时出现什么错误?另外,什么'datas'?它是如何声明的? – MarcinJuraszek

+0

错误消息是“*底层提供程序在Open。​​上失败”,内部说该操作在事务的当前状态中无效。变量* datas *是一个拥有类型为* Guid *的属性的类。只是SQL中表的表示。 –

+0

你正在调用'Select',所以它必须是一个集合。它是如何声明的?尝试直接使用'context'。 – MarcinJuraszek

回答

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();​ 
相关问题