因为我可以在LINQ 3.5的where子句中调用一个方法?

时间:2012-08-13 16:33:08

标签: c# asp.net linq methods .net-3.5

因为我可以在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;
    }
}

1 个答案:

答案 0 :(得分: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));