这可以完全通过linq完成吗?

时间:2013-05-19 08:16:42

标签: c# linq

我有一个进程,我在列表中标识行(unmatchedClient)然后调用一个单独的方法来删除它们(pingtree.RemoveNodes)。这似乎有点长,我只能通过将属性“DeleteFlag”的值设置为true来实现同样的目的。但是如何使用linq设置值?

var unmatchedClient = pingtree.Nodes.Where(x =>
    _application.LoanAmount < x.Lender.MinLoanAmount ||
    _application.LoanAmount > x.Lender.MaxLoanAmount ||
    _application.LoanTerm < x.Lender.MinLoanTerm ||
    _application.LoanTerm > x.Lender.MaxLoanTerm)
.Select(x => x.TreeNode)
.ToList();

pingtree.RemoveNodes(unmatchedClient);

提前致谢。

2 个答案:

答案 0 :(得分:6)

喜欢这个吗?

pingtree.Nodes.Where(x =>
        _application.LoanAmount < x.Lender.MinLoanAmount ||
        _application.LoanAmount > x.Lender.MaxLoanAmount ||
        _application.LoanTerm < x.Lender.MinLoanTerm ||
        _application.LoanTerm > x.Lender.MaxLoanTerm)
        .Select(x => x.TreeNode)
        .ToList()
        .ForEach(n=> n.DeleteFlag = true);

答案 1 :(得分:3)

  

但是如何使用linq设置值

你没有。周期。

Linq是查询语言,查询正在阅读。

有一些人滥用以设定价值观。在你的情况下,它看起来像:

pingtree.Nodes.Where(...)
              .Select(n => { n.DeleteFlag = true; return n; }

但这确实没有完成。首先是因为它出人意料。 Linq方法(包括Select)应该保持源集合不变。其次,因为语句本身不会因为延迟执行而做任何事情。你必须强制执行(例如通过ToList())才能使其生效。

也许这看起来像挑剔,但是当查询变得更复杂时,它就成了一个重点。进行投影(Select)后跟过滤器(Where)并不罕见。例如,您可能决定在投影后进行过滤(其中n.Deleted == false)。

因此,您使用linq查询对象,然后循环遍历它们以执行任何需要执行的操作。 ToList().ForEach()是您可以使用的方法之一。

Side节点:我展示的后门在使用linq-to-sql或实体框架时会抛出异常。