0

我最近开始玩 Linq(提示 groans),并试图编译以下内容。现在,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 });
}
4

2 回答 2

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(例如绑定到表单或诸如此类)。

于 2013-03-26T07:23:48.490 回答
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);
}
于 2013-03-26T07:24:37.840 回答