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)
除了简单的财产分配外,我显然没有做任何其他事情.为什么这个查询失败了?
您当前的代码是有效的:
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)
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |