首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在具有每个层次结构的表继承的LINQ to Entities查询中强制转换为派生类型

在具有每个层次结构的表继承的LINQ to Entities查询中强制转换为派生类型
EN

Stack Overflow用户
提问于 2012-08-29 03:03:58
回答 5查看 12.1K关注 0票数 24

我有一个LINQ到实体模型与表每个层次结构继承。我有一个基类型的查询,我想做一个特定的依赖于类型的逻辑。例如:

代码语言:javascript
复制
IQueryable<BaseType> base = ...

// this works fine
var result = base.Select(b => b is DerivedType1 ? 1 : 2).ToList();

// this doesn't compile to SQL
var result2 = base.Select(b => b is DerivedType1 ? ((DerivedType1)b).DerivedProperty : null).ToList();

有没有办法在不单独处理每个派生类型的IQueryables的情况下做到这一点:

代码语言:javascript
复制
// I'd rather not do this:
var resultA = base.OfType<DerivedType1>().Select(d => d.DerivedProperty);
var resultB = base.OfType<DerivedType2>().Select(d => default(int?));
var result = resultA.Concat(resultB).ToList();
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-19 00:49:48

LINQ- to -Entities不支持直接转换为像(DerivedType1)b这样的实体类型,但是as运算符(b as DerivedType1)支持,因此您可以尝试:

代码语言:javascript
复制
var result2 = base
    .Select(b => b is DerivedType1
        ? (b as DerivedType1).DerivedProperty
        : null)
    .ToList();
票数 31
EN

Stack Overflow用户

发布于 2013-04-18 21:49:24

代码语言:javascript
复制
OfType<DerivedType1>() 

将返回一个IEnumerable,如果可能的话,尝试将基本类型更改为IEnumerable而不是IQueryable,在使用IQueryable时可能会增加一些SQL限制。

当然,如果你实际上不是在查询数据库的话?

票数 1
EN

Stack Overflow用户

发布于 2013-07-24 03:15:42

您可以使用EntityFramework.Extended来提高查询的性能,而不是与数据库进行两次往返。

代码语言:javascript
复制
var resultA = base.OfType<DerivedType1>().Select(d => d.DerivedProperty).Future();
var resultB = base.OfType<DerivedType2>().Select(d => default(int?)).Future();
var result = resultA.Concat(resultB).ToList();

在这种情况下,只执行一次到bd的往返。这个框架对其他很多事情都非常有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12165805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档