asp.net-mvc - Entity Framework - 选择特定列并返回强类型而不丢失强制转换

标签 asp.net-mvc linq linq-to-sql entity-framework inheritance

我正在尝试做类似于 this post 的事情我不会从特定实体中撤回所有列,但是我的框架利用了继承,并且在将实体类型强制转换为匿名类型后,我失去了实体类型的范围。

我的 Entity Framework 的结构有一个名为 Action 的基本实体。从这里我创建了两个继承的实体,称为事件和事件。我想拉回最后一个 X Action 并将它们传递给我接受 Action 的强类型 View ,然后从那里确定它是事件还是事件并呈现正确的局部 View 。

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

但是,一旦我将新的操作列表传递给我的强类型 View ,它就会失去它是事件还是事件的范围,因为它已被转换为操作。我的问题是,在不公开鉴别器列的情况下,有没有办法将每个项目转换为正确的类型,或者我是否以错误的方式进行处理?

最佳答案

有点笨拙,但会起作用:

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 查询中将其转换为可空类型。

关于asp.net-mvc - Entity Framework - 选择特定列并返回强类型而不丢失强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1646267/

相关文章:

c# - 如何正确使用 LINQ2SQL DataContext 对象;每次使用重新创建都会让人头疼

linq-to-sql - 如何在 linq to sql 查询中调用 UDF?

asp.net-mvc - 通过 RPXNow 加快 20 秒 OpenID 登录速度

javascript - 手动向 mvc 表单添加不显眼的验证

c# - Linq 从 Dictionary 值匹配中返回WhereEnumerableIterator?

c# - 使用相同的 SQL 生成输出将 T-SQL 转换为 Fluent Linq C#

c# - 为什么 Environment.NewLine 在我的 String.Replace() 中不起作用,但 "\n"却起作用?

asp.net-mvc - TFS:无法从程序集 Microsoft.ReportViewer.WebForms 加载 "Microsoft.Reporting.RdlCompile"任务,版本=11.0.0.0

asp.net-mvc - 将Using Blocks放入存储库中有什么问题?

linq - 如何在 LINQ 中加入常量?