2

我有以下功能(如果重要,它托管在 WCF 服务中):

    public List<IceVsRepositoryFile> GetRepositoryFilesByRepositoryId(int repId)
    {
        var entity = new IceVSEntities();
        var files = from p in entity.Files where p.RepositoryId == repId select p.FileId;
        List<long> iList = files.ToList();
        var repFiles = from p in entity.RepositoryFiles where iList.Contains(p.FileId) select p;

        if (!repFiles.Any())
            return null;

        var retFiles = repFiles.ToList().Select(z => new IceVsRepositoryFile
            {
                FileId = (int)z.FileId,
                RollbackFileId = (int)z.RollbackFileId,
                UserId = (int)z.UserId,
                FileContents = z.FileContents,
                ChangeDescription = z.ChangeDescription
            }).ToList();

        return retFiles;
    }

当我运行此函数时,我收到以下错误消息:“LINQ to Entities 无法识别方法 'Boolean Contains(Int64)' 方法,并且此方法无法转换为存储表达式。

我明白为什么我会收到错误消息。我的问题是,如何重写我的查询以使其按预期工作?我的后端数据库,如果重要的话,如果是 SqlLite 3。我使用的是 .NET 3.5。

4

3 回答 3

1

您使用的 contains 是 for List,它不在 IEnumerable 中,因此无法转换为相应的 sql 查询。相反,您可以使用Any, ... 像:

iList.Any(x=>x == p.FileId) (or use related property)

也不要这样做:

List<long> iList = files.ToList();

在您的查询中使用files.Any...以防止从数据库中获取过多。实际上使用 IEnumerable 函数而不是List函数。

于 2012-08-12T22:40:48.933 回答
1

我相信加入可以做到这一点:

public List<IceVsRepositoryFile> GetRepositoryFilesByRepositoryId(int repId)
{
  var entity = new IceVSEntities();    

  var repFiles = from file in entity.Files where file.RepositoryId == repId join repFile in entity.RepositoryFiles on repFile.FileId equals file.FileId select repFile;

  var retFiles = // as before

  return retFiles;

}
于 2012-08-13T01:28:50.383 回答
0

Files 和 RepositoryFiles 之间有关系吗?如果是这样,做这样的事情会更容易:

var repFiles = from p in entity.RepositoryFiles where p.File.RepositoryId == repId select p;

这将避免无法将查询转换为 SQL 的问题。

于 2012-08-12T23:19:39.090 回答