我最近开始玩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 });
}
答案 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);
}