实体框架联盟和投影失败

时间:2013-02-05 13:53:42

标签: c# entity-framework

这是一个多方面的问题所以请耐心等待!我有两个问题:

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => b.Table2);

var staticResult = Repository.Select<Table2>()
                       .Where(b => b.column == "CONSTANT");

return dynamicResult.Union(staticResult).ToList();

这很好用。现在我已经向Table2类添加了一个额外的属性,并指示EF忽略我的配置中的字段,如下所示:

Ignore(e => NewColumn);

这也很有效,因为我可以正确设置字段,而不会抛出异常。现在我不知道是否有一种简单的方法可以做我想做的事情。在我的第一个查询中,Table1有一个列,我想用它来保护Table2上的这个新列,但我不知道一个简单的方法。我唯一能想到的是:

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn ... <additional initialization> });

这有点乱,初始化会很长,因为这个实体有大约15个我需要水合的列。当然,我可以在我的属性中遍历Table2和Table1之间的关联,而不是尝试在上面的查询中设置它,但这似乎是额外的工作和另外一个要维护的查询。此外,使用上述方法时,我的工会不再有效。如果我的查询如下:

var dynamicResult = Repository.Select<Table1>()
                        .Where(b => b.InactivatedD == null)
                        .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn })

var staticResult = Repository.Select<Table2>()
                       .Where(b => b.column == "CONSTANT")
                       .Select(b => new Table2 { Column1 = b.Table2.Column1, NewColumn = b.SomeColumn })

return dynamicResult.Union(staticResult).ToList();

我得到一个例外,实体或复杂类型,表2,不能由实体框架查询构造,哪种类型让我不知所措。我明白为什么在我告诉EF忽略NewColumn之前我得到了这个错误,但现在我不确定为什么会出现这个错误。

总结:有没有更好的方法来保护我的新专栏,然后我在上面提出的建议,任何人都可以确定为什么我无法在查询中使用new创建联合实体?

谢谢!

1 个答案:

答案 0 :(得分:1)

永远不允许在EF查询中创建实体类型,无论您使用哪个属性。原因是EF无法跟踪这些实体,因为它本身并没有实现它们。

您应该定义一个类似Table2的类型,包括两个查询中该类型的新列和项目。您将能够联合查询。