2013-03-18 82 views
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所有条目。存在情况下,密钥在MyTable存在,但不是SomeTable

+0

我在阅读本文时遇到了一些麻烦。您是否打算在两个表上进行组连接,然后将其重新映射到其中一个表的对象中?因为你正在查询'db.MyTable',然后选择一个类型为MyTable的对象。 – IronMan84 2013-03-18 17:46:03

+0

另外,什么是'x.h.DefaultIfEmpty'? 'h'与它有什么关系? – IronMan84 2013-03-18 17:47:06

+0

在问题的底部添加了一些信息。希望有帮助 – Jeff 2013-03-18 17:51:22

回答

1

就像错误说,你不能从一个查询中创建一个实体的实例。

看起来你正试图用属性SomeTable覆盖MyTable的属性。该解决方案的一个缺点是如果实体被保存(这可能是你想要的,但它看起来不像你的使用),新的CssClass值将被保存回MyTable。如果您需要需要这样做,您将不得不为实体提供水合物(例如,使用ToList()),然后循环以使用来自相关实体的值更新值。

你最好的选择可能是将要创建一个类型,它是实际的实体类的独立您的视图使用,而不是意见耦合到实体类。它增加了一些工作来映射两个班级之间的关系,但您可以避免出现像您所面临的问题。我可以在数据模型中看到一个挑战 - 您如何知道CssClass值是否应该保存为MyTableSomeTable

+0

我想这样做是没有意义的。懒惰再次让我。我一直试图找到一个解决方法来创建另一个ViewModel,这就是为什么我尝试了'。忽略上面的垃圾。 – Jeff 2013-03-18 18:17:02

+0

不幸的是,只要你的存储模型和我们的视图模型有区别,最好不要尝试和改变视图中使用的存储模型。 – 2013-03-18 18:36:58