"在构造函数和初始值设定项中,在使用对象初始值设定项语法时,仅支持属性或字段参数绑定"

Dan*_*mov 1 c# linq-to-entities entity-framework object-initializers entity-framework-4

我在实体框架查询中遇到一个非常奇怪的问题,我花了几个小时.

执行查询时,我得到一个异常:

在构造函数和初始值设定项中,LINQ to Entities中仅支持属性或字段参数绑定.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.NotSupportedException:在构造函数和初始值设定项中,LINQ to Entities中仅支持属性或字段参数绑定.

我知道当您调用带有查询内部参数构造函数时,通常会发生此问题.这很自然,因为LINQ to Entities无法知道那里发生了什么.

但是,我的查询只使用对象初始化程序语法来填充值,我假设将调用默认的无参数构造函数:

private static readonly Func<MyEntities, int, MessageParty> _getUserMessagePartyQuery = CompiledQuery.Compile(
    ( MyEntities ctx, int id ) =>
        ctx.Users
        .Where( u => u.ID == id )
        .Select( u => new {
            u, up = u.UserProfile, img = u.UserProfile.Image
        })
        .Select( info => new MessageParty
        {
            PartyID = id,
            Title = info.u.FullName,

            // Assignment below causes the failure:
            Image = {
                Image = info.img,
                ExternalUrl = info.up.ExternalProfileImageUrl
            },

        } ).First()
    );
Run Code Online (Sandbox Code Playgroud)

要重新迭代,导致失败的部分是:

Image = {
    Image = info.img,
    ExternalUrl = info.up.ExternalProfileImageUrl
}
Run Code Online (Sandbox Code Playgroud)

Image是类型的属性ImageInfo,它是超级简单的类:

public class ImageInfo
{
    public Model.Image Image
    {
        get;
        set;
    }

    public string ExternalUrl 
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

除了简单的财产分配外,我显然没有做任何其他事情.为什么这个查询失败了?

Jon*_*eet 5

您当前的代码是有效的:

MessageParty tmp = new MessageParty();
// Other stuff
tmp.Image.Image = info.img;
tmp.Image.ExternalUrl = info.up.ExternalProfileImageUrl;
Run Code Online (Sandbox Code Playgroud)

换句话说,它设置现有 ImageInfo(如果有)的属性而不是创建 属性ImageInfo.这称为嵌套对象初始值设定项.

我怀疑你希望它等同于:

MessageParty tmp = new MessageParty();
// Other stuff
ImageInfo tmpImage = new ImageInfo();
tmpImage.Image = info.img;
tmpImage.ExternalUrl = info.up.ExternalProfileImageUrl;
tmp.Image = tmpImage;
Run Code Online (Sandbox Code Playgroud)

因此,请更改您的查询以使用:

Image = new ImageInfo {
    Image = info.img,
    ExternalUrl = info.up.ExternalProfileImageUrl
}
Run Code Online (Sandbox Code Playgroud)