1

LINQ の where 句でメソッドを呼び出すことができるので、または既存のファイルのみを表示する条件を追加する方法を教えてください。

目的: サーバーに存在するドキュメントのリストを表示する

クエリ:

var query = from d in dtContext.documents
where FileExists(d.Id, d.Path) == true
select d;

方法:

Private bool FileExists (int ID, string Path)
{
    if(File. Exists(Server.MapPath(Path))
        return true
    else
    {
        using (Model.DataContext dt = new Model.DataContext())
        {
            var vDoc = dt.Documents.Where(x => x.DocumentId == ID).FirstOrDefault();
                vDoc.Status = false;
                dt.SubmitChanges();
        }
        return false;
    }
}
4

1 に答える 1

3

プロバイダー関数にマップできない場所でメソッドを呼び出すことはできません (つまり、SQL Server は関数を実行できますか?)。

すべてのドキュメントをメモリにフェッチする必要があります。可能であれば、列を制限してメモリ使用量を制限します。

// fetch all documents as an enumerable sequence
var documents = dtContext.Documents.AsEnumerable();
return documents.Where(d => FileExists(d.Id, d.Path));

または、ファイルが配置されているパスがわかっている場合は、ファイル システムをスキャンして、存在するすべてのファイルのリストを取得し、それをクエリに渡すことができます。

string[] filePaths = ....
var documents = dtContext.Documents.Where(d => filePaths.Contains(d.Path));
于 2012-08-13T16:43:03.807 に答える