使用LINQ和vars时如何避免方法长度蠕变

时间:2014-03-10 17:14:47

标签: c# .net linq methods var

我正在使用变量来捕获从数据库中的表中选择的匿名类型。太棒了,我喜欢它。但是,由于变量不能作为方法参数,因此该技术促进了无法分解的过长方法的演变,例如。

...
var res1 = (from t1 in dao.t1
            select new { t1.Id, t1.Cost, t1.Size }).ToList();

<do stuff with res1 ...> 

var res2 = (from r1 in res1 where r1.Cost > 100 
         select new { r1.Id, r1.Size }).ToList();

<do stuff with res2 ...> 

var res3 = (from r2 in res2 where r2.Size > 5
             select new { r2.Id }.ToList();

<do stuff with res3 ...>

现在AFAIK由于vars,我无法将这些选择分解为方法。但自然我不想为这些中间变量创建命名类型,因为它真的很笨拙和臃肿。所以我坚持使用过长的方法,对吧?

2 个答案:

答案 0 :(得分:2)

如果您使用的是匿名类型,并且您发现自己希望在单个方法的范围之外使用它,那么是时候将匿名类型提升为新的命名类型;使用它而不是匿名类来获取信息,然后你可以自由地将方法的一部分提取到其他方法中。

答案 1 :(得分:1)

是的,除非您创建自己的类来处理结果,或者返回不同的匿名类型(例如Tuple<...> s)。

  

Anonymous Types (C# Programming Guide)

     

如果必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型。

还有另一种可能从intellisense的方法中获取匿名类型:使用泛型和泛型类型推断。但我不认为它适用于你的情况。