C# 使用LINQ和VAR时如何避免方法长度蠕变

C# 使用LINQ和VAR时如何避免方法长度蠕变,c#,.net,linq,methods,var,C#,.net,Linq,Methods,Var,我使用vars来捕获从数据库中的表中选择的匿名类型。太棒了,我喜欢。然而,由于变量不能作为方法参数,这种技术促进了无法分解的过长方法的发展,例如 ... 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 >

我使用vars来捕获从数据库中的表中选择的匿名类型。太棒了,我喜欢。然而,由于变量不能作为方法参数,这种技术促进了无法分解的过长方法的发展,例如

...
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 ...>
。。。
var res1=(来自dao.t1中的t1
选择新的{t1.Id,t1.Cost,t1.Size}).ToList();
var res2=(来自res1中的r1,其中r1.成本>100
选择新的{r1.Id,r1.Size}).ToList();
var res3=(来自res2中的r2,其中r2.Size>5
选择新的{r2.Id}.ToList();

现在看来,由于变量的原因,我无法将这些选择分解为方法。但我当然不想为这些中间变量创建命名类型,因为这会非常笨拙和臃肿。所以我只能使用过长的方法,对吗?

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

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


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

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

并非所有这些方法都需要匿名类型。假设t1确实有25列,您选择了15列。然后您将它们分组到10列中,以此类推。现在没有理由这样做所有第三个查询都应该是匿名类型;它应该是
List
Id
的任何类型。没有理由只使用一个值的匿名类型。@Servy请参阅我对实际列数(即多个列)的注释@sming-Sure,这就是为什么上面的评论不是对问题的回答,只是一个评论,在这种情况下,你不应该使用匿名类型。如果你不在这种情况下,那么它可能是合适的。我发布的答案回答了实际的问题。