0

我正在尝试向我的搜索页面添加一项功能。基本上,如果某个条件为真(基于与另一个表的连接),则应用一些 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. 存在 Key 存在MyTable但不存在的情况SomeTable

4

1 回答 1

1

就像错误所说的那样,您不能从查询中创建实体 的新实例。

看来您正在尝试MyTable使用来自 的属性覆盖 的属性SomeTable。该解决方案的一个缺点是,如果实体被保存,新CssClass值将被保存回MyTable(这可能是您想要的,但根据您的使用情况,它看起来不像)。如果你真的需要这样做,你将不得不对实体进行水合(例如 with ToList()),然后循环使用来自相关实体的值来更新值。

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

于 2013-03-18T17:51:03.347 回答