0

私は最近Linq(cue 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

2つの即時オプションは?:、共通/開始クエリを使用または抽出することです。

前者の場合:

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 に答える