无法投射左连接

时间:2013-03-18 17:39:25

标签: c# asp.net-mvc linq entity-framework

我正在尝试向搜索页面添加功能。基本上,如果某个条件为真(基于与另一个表的连接),则应用一些CSS类。这是我的(简化)模型:

MyTable
int Key
string Someinfo1
string Someinfo2
string CssClass

SomeTable
int Key
string CssClass

使用LINQ,我希望加入这两个表并分配SearchResult.CssClass = SomeTable.CssClass。实际上,这个任务有一些逻辑。

var test = db.MyTable
    .GroupJoin(db.SomeTable,
                m => m.Key,
                s => s.Key,
                (m, s) => new {m, s})
    .SelectMany(x => x.h.DefaultIfEmpty(),
                (x, y) => new MyTable
                {
                    Key = x.m.Key,
                    Someinfo1 = x.m.Someinfo1,
                    Someinfo2 = x.m.Someinfo2,
                    CssClass = y.CssClass
                }

此代码中断,给出错误

The entity or complex type 'MyTable' cannot be constructed in a LINQ to Entities query.

如果我只是简单地更改了投射(x, y) => new MyTable来创建一个匿名类型(x, y) => new,那么事情就像我期望的那样。但是,我需要将其键入为MyTable以与当前存在的视图兼容。为什么它在尝试施放时会破坏,否则它会正常工作?事后投射也不起作用。提前致谢

编辑:澄清一下,MyTable映射到数据库表,但CssClass除外。我已将EF配置为忽略该元素

modelBuilder.Entity<MyTable>().Ignore(m => m.CssClass);

MyTable.CssClass的理想值来自SomeTable

DefaultIfEmpty()用于包含MyTable中的所有条目。存在MyTable中存在密钥但不存在SomeTable

的情况

1 个答案:

答案 0 :(得分:1)

就像错误所说的那样,您无法在查询中创建实体的 new 实例。

您似乎试图使用MyTable中的属性覆盖SomeTable的属性。该解决方案的一个缺点是,如果保存了实体,新的CssClass值将保存回MyTable(这可能是您想要的,但它似乎不是基于您的使用情况)。如果确实需要这样做,那么您将不得不对实体进行水合(例如使用ToList()),然后循环以使用相关实体的值更新值。 / p>

您最好的选择可能是创建一个与您的视图使用的实际实体类独立的类型,而不是将视图耦合到您的实体类。它增加了一些工作来映射两个类,但你可以避免像你面临的问题。我已经可以通过您的数据模型看到一个挑战 - 您如何知道CssClass值是应该保存回MyTable还是SomeTable