无法创建类型(类型)的常量值在此上下文中仅支持基本类型(例如Int32,String和Guid')

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)

或者您必须使用照片和相册之间的某些连接来构建复杂查询.您不能将本地对象及其任何关系传递给查询.只能传递简单的属性.


Dou*_*las 5

我认为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 次

最近记录:

10 年,1 月 前