【问题标题】:"In constructors and initializers, only property or field parameter bindings are supported" when using object initializer syntax使用对象初始值设定项语法时,“在构造函数和初始值设定项中,仅支持属性或字段参数绑定”
【发布时间】:2011-09-30 08:52:10
【问题描述】:

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

执行查询时出现异常:

在构造函数和初始化程序中,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()
    );

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

Image = {
    Image = info.img,
    ExternalUrl = info.up.ExternalProfileImageUrl
}

ImageImageInfo类型的属性,是超级简单的类:

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

    public string ExternalUrl 
    {
        get;
        set;
    }
}

我显然 除了简单的属性分配之外没有做任何其他事情。为什么这个查询会失败?

【问题讨论】:

    标签: c# entity-framework entity-framework-4 linq-to-entities object-initializers


    【解决方案1】:

    你当前的代码是有效的:

    MessageParty tmp = new MessageParty();
    // Other stuff
    tmp.Image.Image = info.img;
    tmp.Image.ExternalUrl = info.up.ExternalProfileImageUrl;
    

    换句话说,它正在设置现有 ImageInfo(如果有的话)的属性,而不是创建一个 ImageInfo。这称为嵌套对象初始化器

    我怀疑你希望它等同于:

    MessageParty tmp = new MessageParty();
    // Other stuff
    ImageInfo tmpImage = new ImageInfo();
    tmpImage.Image = info.img;
    tmpImage.ExternalUrl = info.up.ExternalProfileImageUrl;
    tmp.Image = tmpImage;
    

    所以更改您的查询以使用:

    Image = new ImageInfo {
        Image = info.img,
        ExternalUrl = info.up.ExternalProfileImageUrl
    }
    

    【讨论】:

    • 你是个圣人。我已经通过再摆弄代码一个小时找到了这个修复程序,并且正要发布它,但你设法在我之前完成了它,并且有一个解释!非常感谢。
    【解决方案2】:

    更新: 有人发布了nice answer,解释了我错在哪里,以及为什么我错了。看看吧。

    尝试在不同的电脑上一步步重现错误后,终于找到了问题的根源。

    我正确地确定了Image 分配是问题的根源,但是当我意识到明确指定类名解决了问题时,我大吃一惊

    Image = new ImageInfo { // was: Image = {
        Image = info.img,
        ExternalUrl = info.up.ExternalProfileImageUrl
    }
    

    我认为new ImageInfo 对于假定匹配类型的默认构造函数的对象初始化器语法是可选的,但不知何故它是强制性的,至少对于 LINQ to Entities。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2022-10-04
      • 2013-06-24
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多