我有以下功能(如果重要的话,它托管在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。
答案 0 :(得分:1)
您使用的包含用于List
,它不在IEnumerable中,因此无法转换为相应的sql查询。相反,您可以使用Any
,...赞:
iList.Any(x=>x == p.FileId) (or use related property)
而不是做:
List<long> iList = files.ToList();
在查询中使用files.Any...
以防止从DB中获取太多内容。实际上使用IEnumerable函数而不是List
函数。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
你和Files和RepositoryFiles之间有关系吗?如果是这样,那么做这样的事情会更容易:
var repFiles = from p in entity.RepositoryFiles where p.File.RepositoryId == repId select p;
这将避免无法将查询转换为SQL的问题。