0

这是一个多方面的问题,所以请多多包涵!我有两个疑问:

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);

这也很有效,因为我可以正确设置字段而 EF 不会抛出异常。现在我不知道是否有一种简单的方法可以做我想做的事。在我的第一个查询中,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 创建的实体?

谢谢!

4

1 回答 1

1

无论您处理哪些属性,都不允许在 EF 查询中创建实体类型。原因是 EF 无法跟踪此类实体,因为它本身并没有实现它们。

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

于 2013-02-05T21:31:16.617 回答