使用这个答案,我现在可以将投影逻辑存储在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导航特性转换为模型?
这目前可能以一种过于复杂的方式出现:
p =>
new BlogPostModel
{
...,
Author = new[] { p }.AsQueryable().Select(UserModelExtensions.ToModelConverterExpression).FirstOrDefault()
}
然而,生成的SQL虽然是正确的,但却不必要地复杂和缓慢。据我所知,还没有任何方法可以直接得到你想要的东西,但我一直在寻找同样的东西,我有一个开源的概念验证补丁,我计划提交给大家,请参阅讨论线程和更改。