重写Linq查询以使用if / else并丢弃var
本文关键字:else var if 查询 Linq 重写 | 更新日期: 2023-09-27 18:05:46
我最近开始玩Linq(提示呻吟),我试图得到以下编译。现在,where子句部分使用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 });
}
由于似乎查询中的唯一区别是是否包含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
(如绑定到表单或诸如此类)。
两个直接的选择是使用?:
或提取公共/开始查询。
对于前者:
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);
}