【问题标题】:As I can call a method in the where clause in LINQ 3.5?我可以在 LINQ 3.5 的 where 子句中调用一个方法吗?
【发布时间】:2012-08-09 22:16:30
【问题描述】:

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

【问题讨论】:

  • 您的问题令人困惑。您是在问“如何在 where 子句中添加条件以仅显示现有文件?”
  • 什么不起作用?除了验证文件dt.SubmitChanges() 之外,还查看文件出口中的 else 分支看起来像是在做其他工作?这可能是个问题
  • 你为什么要在数据库中寻找文件存在?
  • 问题是LINQ不识别这些方法,(想翻译成SQL)我得到的问题与真正的问题无关,通过使DataBind()获取DataGrid错误页面(其中工作正常)
  • 除了您的方法中明显的设计缺陷之外,您在示例中的查询看起来应该像我期望的那样工作。

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


【解决方案1】:

您不能在无法映射到提供程序函数的地方调用方法(即 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));

【讨论】:

  • 你可以在这里使用AsEnumerable,而不是ToList。您需要确保使用IEnumerable,而不是IQueryable 重载,但您仍然不需要 急切地将所有内容加载到列表中;数据仍然可以流式传输(或者查询推迟到以后)。当然,只要您有足够的内存来执行此操作,这不是什么大问题。在我看来AsEnumerable 也使意图更加清晰,但这当然值得商榷。
  • +1 对来自@Servy 的评论使用ToList() 而不是AsEnumerable() 当你不能说明一个好的理由是过早的悲观。
  • 我按照您的建议 (Phil),我收到错误“AllowCustomPaging 必须为 true,并且当 AllowPaging 设置为 true 且所选数据源未实现时,必须为 ID DataGrid1 的 DataGrid 设置 VirtualItemCount ICollection。”
  • 1+ 用于 AsEnumerable 上的 Servy 响应。如果数据库有大量记录,这可以防止内存使用量激增。
  • 非常感谢您的回复、时间和经验,除了整理出您帮助我理解这个问题的问题
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 2017-07-18
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多