重写Linq查询以使用if / else并抛弃var

时间:2013-03-26 07:14:55

标签: c# .net

我最近开始玩Linq(提示呻吟声),我正在努力让以下内容进行编译。现在,whereclause部分使用DynamicLinq,它工作正常;它是编译器想要真实类的var占位符变量;不幸的是,我使用的是我认为的匿名课程,并且不确定如何从这里开始。有什么建议吗?

var query;
if(whereclause != string.Empty) 
{
    query = Directory.GetFiles(LRSettings.Default.OperatingDirectory, LRSettings.Default.FileExtension,
    SearchOption.AllDirectories).AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename)
        .LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length })
        .Where(whereclause);
}
else 
{
    query = Directory.GetFiles(LRSettings.Default.OperatingDirectory,
                               LRSettings.Default.FileExtension,
                               SearchOption.AllDirectories)
        .AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename).LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length });
}

2 个答案:

答案 0 :(得分:2)

由于您的查询中唯一的区别似乎是否包含WHERE子句,您应该能够这样做:

var query = Directory.GetFiles(LRSettings.Default.OperatingDirectory, LRSettings.Default.FileExtension, SearchOption.AllDirectories)
        .AsQueryable()
        .Select(Filename => new { Filename, new FileInfo(Filename).LastWriteTime, new FileInfo(Filename).Extension, new FileInfo(Filename).Length });

if(whereclause != string.Empty) 
{
    query = query.Where(whereclause);
}

由于您使用的是IEnumerable,我认为您不必担心在没有Where()子句的情况下拉过太多数据,因为在您访问{query之前它不会被枚举以某种方式(比如绑定到表单或诸如此类的东西)。

答案 1 :(得分:1)

两个直接选项是使用?:或提取公共/起始查询。

对于前者:

bool expr = SomeTrueOrFalseValue();
var l = new [] { 1,2,3 };
// both "true" and "false" branches unify an IEnumerable<int>
var q = expr
  ? l
  : l.Where(x => x > 1);
// q typed as IEnumerable<int>

对于后者:

var q = l.AsEnumerable();
// q is typed as IEnumerable<int>
if (!expr) {
    q = q.Where(x => x > 1);
}
// q is still typed as IEnumerable<int> - can't be changed after var

分配必须包含在var声明中,以便确定变量的类型。

但没有var:

IEnumerable<int> q; // not practical/possible for complex types
if (expr) {
   q = l;
} else {
   q = l.Where(x => x > 1);
}