Can*_*ğlu 11 linq linq-to-entities many-to-many entity-framework
我读过以下所有内容:
并搜索了一下,但仍然没有解决方案.我已经看到这种情况发生在EF 3.5和4.0中Contains应该支持该方法,但我在EF 4但是我收到了这个错误.我有一个照片库,相册可以有任意数量的不同照片,每张照片都可以属于任意数量的相册.所以这是一个多对多的关系.
我有一个VisibleObjects属性,大约100种其他方法使用的方法很好,但我仍然粘贴它:(我绝对肯定问题不是由这里的东西造成的)
static IQueryable<GlobalObject> VisibleObjects
{
get
{
return from obj in db.GlobalObjectSet where obj.IsVisible && !obj.SiteUser.IsDeactivated orderby obj.ID descending select obj;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的查询:
我有一个VisiblePhotos属性:
这不起作用:
static IQueryable<Photo> VisiblePhotos(this Album a)
{
return from p in VisibleObjects.OfType<Photo>() where a.Photos.Contains(p) select p;
}
Run Code Online (Sandbox Code Playgroud)
改为:
static IQueryable<Photo> VisiblePhotos(this Album a)
{
return from p in VisibleObjects.OfType<Photo>() where a.Photos.Any(other => p.ID == other.ID) select p;
}
Run Code Online (Sandbox Code Playgroud)
仍然没有奏效.
这是调用方法:
public static List<Photo> GetLatestPhotosByAlbum(Album alb, int count = 3)
{
lock (sync)
{
return alb.VisiblePhotos().OrderByDescending(p => p.ID).Take(count).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
没有工作,改为:
public static List<Photo> GetLatestPhotosByAlbum(Album alb, int count = 3)
{
lock (sync)
{
return (from p in VisibleObjects.OfType<Photo>()
where alb.Photos.Any(ph => ph.ID == ph.ID)
select p).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
还是不行.抱怨无法创建我的Photo对象类型的常量,这是一个具有ID属性的Entity对象,如果有帮助的话.我不确定错误的真正原因,我在脑海中没有任何其他查询的想法.我认为方法名称非常自我解释:我正试图在给定的专辑中获取照片.将相册条目加载到内存中不是解决方案,查询应该在数据库而不是内存上运行.我需要解释这个异常,为什么会在这里发生,以及如何让我的查询工作.
Lad*_*nka 12
它不起作用,因为您想在linq-to-entities查询中使用本地相册.您必须使用p上的导航属性来获取其相册:
var query = from p in VisibleObjects.OfType<Photo>()
where p.Album.Id == alb.Id
select p;
Run Code Online (Sandbox Code Playgroud)
或者您必须使用照片和相册之间的某些连接来构建复杂查询.您不能将本地对象及其任何关系传递给查询.只能传递简单的属性.
我认为EF正在尝试转换where a.Photos.Contains(p)为SQL WHERE p IN (a.Photos),但它不知道如何a.Photos在SQL中表达.您想要的SQL可能看起来像WHERE p.Id IN (1, 2, 3),所以您可以尝试在C#中执行此操作:
static IQueryable<Photo> VisiblePhotos(this Album a)
{
var photoIds = a.Photos.Select(p => p.Id).ToArray();
return from p in VisibleObjects.OfType<Photo>() where photoIds.Contains(p.Id) select p;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21487 次 |
| 最近记录: |