加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 实体框架 – 选择特定列并返回强类型而不丢失强

发布时间:2020-12-16 06:56:36 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试做类似于 this post的事情,我不会从特定实体中撤回所有列,但是我的框架使用了继承,并且在将其转换为匿名类型后我失去了实体类型的范围. 我的Entity Framework的结构有一个名为Action的基本实体.从这里开始,我创建了两个名为Event和Activity的继承
我正在尝试做类似于 this post的事情,我不会从特定实体中撤回所有列,但是我的框架使用了继承,并且在将其转换为匿名类型后我失去了实体类型的范围.

我的Entity Framework的结构有一个名为Action的基本实体.从这里开始,我创建了两个名为Event和Activity的继承实体.我想撤回最后的X个动作并将它们传递给我的强类型视图,该视图接受一个Action,并从那里确定它是一个Activity还是Event并呈现正确的局部视图.

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

但是,一旦我将新的动作列表传递给我的强类型视图,它就失去了它是一个活动还是一个事件的范围,因为它被强制转换为动作.我的问题是,在没有暴露鉴别器列的情况下,有没有办法将每个项目转换为正确的类型,或者我是以错误的方式进行此操作?

解决方法

有点kludgy,但会工作:

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,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,EventSpecific = o.EventSpecific // will be null,but using o.EventSpecific saves casting
                                           }
                          }).ToList();

如果o.EventSpecific属于非可空类型,则必须在L2E查询中将其转换为可空类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读