【问题标题】:How to apply projections on FK property in Entity Framework?如何在实体框架中对 FK 属性应用投影?
【发布时间】:2012-08-20 13:38:20
【问题描述】:

使用这个answer,我现在可以将我的投影逻辑存储在Expression 中,并在另一个投影中使用它。

但是,当我开始在我的解决方案中实现此方法时,我发现我无法在作为单个 FK(不是集合)的 Navigation 属性上使用存储的 Expression

以下代码演示了这个问题:

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, };
    }
}

是否可以使用Expression 将单个 FK 导航属性转换为模型?

【问题讨论】:

    标签: asp.net-mvc entity-framework linq-to-entities


    【解决方案1】:

    目前这可能以一种过于复杂的方式实现:

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

    然而,生成的 SQL 虽然是正确的,但却是不必要的复杂和缓慢。据我所知,目前还没有任何方法可以直接获得您想要的东西,但我一直在寻找同样的东西,并且我有一个用于开源的概念验证补丁,用于即将成为 EF-我计划提交的 6.0,请参阅 the discussion threadthe change

    【讨论】:

    • 嗯,这真的很复杂。很糟糕,我什至不能使用辅助方法,因为'LINQ to Entities 无法识别它'。如果您在 EF 准备好后将您的添加提交到此处,那就太好了。在那之前,我将使用您在此处发布的这个繁琐的解决方案。谢谢!
    • @jakubka 我现在已经把它带到了 EF CodePlex 并在我的答案中包含了链接,抱歉耽搁了。
    • 这个解决方案对我来说看起来有点脏,但它肯定比我们现在拥有的更好!我将尝试将其集成到我们的项目中并返回一些结果。我期待看到生成的 SQL。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多