【问题标题】:Linq mapping between models模型之间的 Linq 映射
【发布时间】:2011-03-23 12:33:05
【问题描述】:

我有一个实体框架的数据模型,其中一些实体具有一组可用于添加额外信息的属性。一些客户希望将这些属性映射到他们自己的域模型的“真实”属性。一个示例数据模型是:

public class DataEntity {  
   public Guid Id { get; set; }
   public virtual ICollection<Attribute> Attributes { get; set; }
}
public class DataAttribute {
   public Guid Id { get; set; }
   public String Name { get; set; }
   public String Value { get; set; }
}
public class DataStringAttribute : DataAttribute {
   public String Value { get; set; }
}
public class DataInt32Attribute : DataAttribute {
   public Int32 Value { get; set; }
}

域模型示例如下:

public class DomainEntity {
    public Guid Id { get; set; }
    public String Name { get; set; }
    public Int32 Age { get; set; }  
}

我可以相当容易地在彼此之间映射实体,但我希望能够在两者之间映射 Linq 表达式,以便在客户端中,它将是 IQueryable&lt;DomainEntity&gt;,但它被映射到 IQueryable&lt;DataEntity&gt; - 对于示例:

myDomainEntities.Where(o => o.Age > 21)

可以映射到:

myDataEntities.Where(o => o.Attributes.OfType<DataInt32Attribute>()
    .Any(o => o.Name = "Age" && o.Value > 21);

最好的方法是什么 - 也许编写一个遍历表达式树并将其转换为使用数据模型的 QueryProvider - Linq-to-Linq-to-EntityFramework?

谢谢。

【问题讨论】:

    标签: .net linq linq-to-entities expression-trees


    【解决方案1】:

    您正在尝试做的事情是非典型的。您可能需要覆盖 Linq-to-Entity 提供程序并覆盖其查询生成功能。您将自己遍历表达式树,然后将该表达式树动态转换为 Linq-to-Entity 可以使用的新树,然后将该树传递给原始提供程序以生成查询。

    换句话说,您正在劫持 Linq-to-Entity 以支持您的自定义格式。毛茸茸的,但如果你得到它的工作,请写下来!我很高兴了解它的工作原理!

    此外,您知道您的客户端不会获得 Intellisense 支持,除非您也为 VS 编写自定义插件。该代码还将在 VS 中被标记为语法错误(我不确定它是否会编译)。这是因为类定义并没有真正改变——实体并没有真正具有这些属性。

    【讨论】:

    • 我认为创建中间查询提供程序的方法(尽管工作量很大)会起作用并且是可编译的。性能方面,它可能不会那么好。我只是想知道是否还有其他选择,以及是否有人尝试过。
    • 我认为没有人尝试过这个,至少没有广泛的知识。但是,请注意 VS 将这些标记为错误 - 您正在重写您的表达式树以从错误转换为正确,但 VS 不知道这一点。它可能会将它们全部标记为错误,并可能拒绝编译。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2011-02-07
    相关资源
    最近更新 更多