通过与另一个列表中的属性匹配的属性过滤列表

时间:2015-07-19 18:22:30

标签: c# linq entity-framework

任务非常简单。给定发票列表和帐户列表,我需要过滤前者,只保留那些与其相关的活动帐户。它应该表现如下的一个例子。

  

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

1 个答案:

答案 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();​