实体框架 - 选择特定的列而不失投返回强类型(Entity Framework - Select s

2019-09-02 09:00发布

我试图做类似的东西这篇文章 ,我不会从一个特定实体拉回来的所有列,但我的框架,利用传承的,我失去了实体类型的范围,它已经转换为匿名类型之后。

我的实体框架的结构有一个称为行动基地的实体。 在这里,我已经创建了两个继承的实体称为事件活动 。 我想给拉了回来,最后X操作,并将其传递给我的,它接受的行动,如果它从那里确定活动或事件,并呈现正确的局部视图强类型的视图。

if(Model.GetType() == typeof(Event))
{
  //render Event view
}
else if(Model.GetType() == typeof(Activity))
{
  //render Activity view
}

我可以拉过去的10作为一个匿名类型,然后投:

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             select new { a.CreatedOn, a.Summary };

List<Action> list = result.AsEnumerable()
                          .Select(o => new Action {
                                           CreatedOn = o.CreatedOn, 
                                           Summary = o.Summary
                          }).ToList();

但是,一旦我通过行动的新名单,以我的强类型的视图就失去它是否是一个活动或者因为某一事件被蒙上作为行动的范围。 我的问题是,不暴露的鉴别列,有没有什么办法,以每个项目转换为正确的类型或我要对这个错误的方式?

Answer 1:

有点缺憾,但将工作:

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             let IsEvent = a as Event != null
             select new { a.CreatedOn, IsEvent, a.Summary };

List<Action> list = result.AsEnumerable()
                          .Select(o => o.IsEvent ?
                                           (Action) new Event {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary
                                           }
                                           : (Action) new Activity {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary
                                           }
                          }).ToList();

与特定类型的柱例如, 假定该e.EventSpecific是可空类型的。

var result = from a in new DataContext().Actions
             where a.UserId == someGuidValue
             let ev = a as Event
             let IsEvent = ev != null
             select new { a.CreatedOn, IsEvent, a.Summary, ev.EventSpecific };

List<Action> list = result.AsEnumerable()
                          .Select(o => o.IsEvent ?
                                           (Action) new Event {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary,
                                               EventSpecific = o.EventSpecific
                                           }
                                           : (Action) new Activity {
                                               CreatedOn = o.CreatedOn, 
                                               Summary = o.Summary,
                                               EventSpecific = o.EventSpecific // will be null, but using o.EventSpecific saves casting
                                           }
                          }).ToList();

如果o.EventSpecific是一个非空类型,则必须将其转换为在L2E查询可空类型。



Answer 2:

你可能在错误的道路。 起初我会假设, Action应该是一个抽象类,你应该不能够再创建它的实例。 如果你那么只有获取属性的子集,该子集也不再允许事件和活动的区分,它可能是错误的方式以尽量事件和活动了出来。

因此,它实际上似乎并不是一个技术问题 - 它应该是很容易包括匿名类型的一些歧视信息 - 但是一个设计问题。 我建议如果需要区分查询结果如果是这样,如果真的是区分中缺乏鉴别的结果是一个好主意重新思考。



文章来源: Entity Framework - Select specific columns and return strongly typed without losing cast