1

この回答を使用して、投影ロジックをに保存し、Expression別の投影内で使用できるようになりました。

Expressionただし、ソリューションにこのアプローチを実装し始めたとき、(コレクションではなく) 単一の FK であるナビゲーション プロパティに格納されている を使用できないことがわかりました。

次のコードは、この問題を示しています。

namespace Entities
{
    public class BlogPost
    {
        public virtual int BlogPostId { get; set; }
        public virtual string Title { get; set; }

        public virtual string NotUsed { get; set; }

        public virtual User Author { get; set; }
    }

    public class User
    {
        public virtual int UserId { get; set; }
        public virtual string Name { get; set; }
        public virtual string NotUsed { get; set; }

        public virtual ICollection<BlogPost> BlogPosts { get; set; }
    }
}

namespace Models
{
    public class BlogPostModel
    {
        public string Title { get; set; }
        public UserModel Author { get; set; }
    }

    public class UserModel
    {
        public string Name { get; set; }
    }

    public static class BlogPostModelExtensions
    {
        public static readonly Expression<Func<BlogPost, BlogPostModel>> ToModelConverterExpression =
            p =>
            new BlogPostModel
            {
                Title = p.Title,
                Author = null, //Problem!
                // I need to convert User (p.Author) to UserModel using UserModelExtensions.ToModelConverterExpression
            };
    }

    public static class UserModelExtensions
    {
        public static readonly Expression<Func<User, UserModel>> ToModelConverterExpression = 
            u => new UserModel{ Name = u.Name, };
    }
}

を使用して単一の FK ナビゲーション プロパティをモデルに変換することは可能Expressionですか?

4

1 に答える 1

2

これは現在、非常に複雑な方法で可能です。

p =>
new BlogPostModel
{
    ...,
    Author = new[] { p }.AsQueryable().Select(UserModelExtensions.ToModelConverterExpression).FirstOrDefault()
}

ただし、生成された SQL は正しくても、不必要に複雑で遅くなります。私の知る限り、あなたが望むものを直接手に入れる方法はまだありませんが、私は同じものを探していて、オープン ソースの to-be-EF- の概念実証パッチを持っています。含めるために送信する予定の 6.0 については、ディスカッション スレッド変更を参照してください

于 2012-08-20T13:50:26.120 に答える