1

Entity Frameworkクエリで、文字通り何時間も費やした非常に奇妙な問題が発生しています。

クエリを実行すると、例外が発生します。

コンストラクターと初期化子では、プロパティまたはフィールドパラメーターのバインディングのみがLINQtoEntitiesでサポートされます。

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとエラーがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

例外の詳細:System.NotSupportedException:コンストラクターと初期化子では、プロパティまたはフィールドパラメーターのバインディングのみがLINQtoEntitiesでサポートされます。

この問題は通常、クエリ内のパラメーターを使用してコンストラクターを呼び出すときに発生することを私は知っています。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
}

ImageタイプのプロパティでありImageInfo、超単純なクラスです。

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

    public string ExternalUrl 
    {
        get;
        set;
    }
}

私は明らかに、単純なプロパティの割り当て以外は何もしていません。このクエリが失敗するのはなぜですか?

4

2 に答える 2

5

現在のコードは事実上次のとおりです。

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
}
于 2011-07-07T10:57:19.050 に答える
0

更新:誰かが、どこで、なぜ私が間違っていたのかを説明する良い答えを投稿しました。見てみな。

別のコンピューターでエラーを段階的に再現しようとした後、私はついに問題の原因を見つけました。

割り当てが問題の原因であると正しく識別しましたが、クラス名を指定することで問題が明示的に解決されることImageに気付いたとき、私は非常に唖然としました。

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

一致する型のデフォルトコンストラクターを想定するオブジェクト初期化構文ではオプションだと思いnew ImageInfoましたが、少なくともLINQ to Entitiesでは、どういうわけか必須です。

于 2011-07-07T10:57:21.383 に答える