Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-使用TPH按ICollection类型筛选LINQ_C#_Entity Framework_Linq - Fatal编程技术网

C# 实体框架-使用TPH按ICollection类型筛选LINQ

C# 实体框架-使用TPH按ICollection类型筛选LINQ,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个类,Main,它有一个不同类型的ICollection(SubA和SubB,父类是parent)。我需要编写一个LINQ查询,使用每个层次结构的表,根据EF中的这些子类型进行过滤。TPH不允许直接查询类型列,因此我试图找到一种解决方法。我在Parent上有一个方法来获取类型字符串。然而,LINQ不支持这一点 如何从Main执行LINQ查询,以筛选每个子项的类型(SubA和SubB),以及子项的一个附加属性 这是获取类型的类方法: public virtual string ReturnT

我有一个类,
Main
,它有一个不同类型的
ICollection
SubA
SubB
,父类是
parent
)。我需要编写一个LINQ查询,使用每个层次结构的表,根据EF中的这些子类型进行过滤。TPH不允许直接查询
类型
列,因此我试图找到一种解决方法。我在
Parent
上有一个方法来获取类型字符串。然而,LINQ不支持这一点

如何从
Main
执行LINQ查询,以筛选每个子项的类型(
SubA
SubB
),以及子项的一个附加属性

这是获取类型的类方法:

public virtual string ReturnType()
{
    return GetType().BaseType.Name;
}
这是我尝试的LINQ查询,但是失败了,因为在LINQ中不支持
ReturnType()

// Main query defined elsewhere in function
query = query.Where(main => main.children.All(child =>
                   (child.ReturnType() == "MS" || child.ReturnType() == "TL") &&
                   child.StatusId != 4);

您可以这样做:

query = query.Where(m => m.StatusId != 4 && (m is SubA || m is SubB));
或者使用类型为
的更为复杂:

var subQuery = query.Where(m => m.StatusId != 4);
query = subQuery.OfType<SubA>()
                .Cast<Main>()
                .Union(subQuery.OfType<SubB>().Cast<Main>());
var subQuery=query.Where(m=>m.StatusId!=4);
query=subQuery.OfType()的子查询
.Cast()
.Union(子查询.OfType().Cast());

您可以执行以下操作:

query = query.Where(m => m.StatusId != 4 && (m is SubA || m is SubB));
或者使用类型为的更为复杂:

var subQuery = query.Where(m => m.StatusId != 4);
query = subQuery.OfType<SubA>()
                .Cast<Main>()
                .Union(subQuery.OfType<SubB>().Cast<Main>());
var subQuery=query.Where(m=>m.StatusId!=4);
query=subQuery.OfType()的子查询
.Cast()
.Union(子查询.OfType().Cast());

您可以执行以下操作:

query = query.Where(m => m.StatusId != 4 && (m is SubA || m is SubB));
或者使用类型为的更为复杂:

var subQuery = query.Where(m => m.StatusId != 4);
query = subQuery.OfType<SubA>()
                .Cast<Main>()
                .Union(subQuery.OfType<SubB>().Cast<Main>());
var subQuery=query.Where(m=>m.StatusId!=4);
query=subQuery.OfType()的子查询
.Cast()
.Union(子查询.OfType().Cast());

您可以执行以下操作:

query = query.Where(m => m.StatusId != 4 && (m is SubA || m is SubB));
或者使用类型为的更为复杂:

var subQuery = query.Where(m => m.StatusId != 4);
query = subQuery.OfType<SubA>()
                .Cast<Main>()
                .Union(subQuery.OfType<SubB>().Cast<Main>());
var subQuery=query.Where(m=>m.StatusId!=4);
query=subQuery.OfType()的子查询
.Cast()
.Union(子查询.OfType().Cast());

哇,我是个白痴,这太简单了。非常感谢,我很感激!哇,我是个白痴,这太简单了。非常感谢,我很感激!哇,我是个白痴,这太简单了。非常感谢,我很感激!哇,我是个白痴,这太简单了。非常感谢,我很感激!