结合两个EF查询,无法将System.Data.Entity.Infrastructure.DbQuery类型的对象强制转换为System.Collections.Generic.IEnumerable

时间:2013-12-26 16:45:23

标签: c# asp.net vb.net entity-framework entity-framework-5

我有两个Entity Framework查询,每个查询返回两列,我想连接或加入两个查询的结果,原因是绑定,

我尝试了Concat方法,但它正在抛出:

无法转换

类型的对象
'System.Data.Entity.Infrastructure.DbQuery`1[VB$AnonymousType_3`2[System.String,System.String]]'
 to type
 'System.Collections.Generic.IEnumerable`1[VB$AnonymousType_2`2[System.String,System.String]]

”。

这是我的代码:

   Dim r = (From PropertyDefinitions In econtext.PropertyDefinitions Join ProductPropertyValues In
            econtext.ProductPropertyValues On ProductPropertyValues.ProductPropDefID Equals PropertyDefinitions.PropertyDefID
            Join AdProductDefValues In econtext.AdProductDefValues
            On AdProductDefValues.PropValueID Equals ProductPropertyValues.ProductPropValueID
            Where AdProductDefValues.AdID = AdID
            Select PropertyDefinitions.PropertyDefName2, AdProductDefValues.DefValue2).Concat(From AdCustomProperties In econtext.AdCustomProperties
            Where AdCustomProperties.AdID = AdID
            Select AdCustomProperties.PropertyTitle2, AdCustomProperties.PropertyValue2)

            GridProperties.DataSource = r.ToArray()
            GridProperties.DataBind()

任何想法结合两个查询的结果?

2 个答案:

答案 0 :(得分:3)

由于具有不同的属性名称,因此枚举数不能连接,因为它们是不同的匿名类型。

一种解决方案是使类型匹配,例如你可以替换这部分:

Select PropertyDefinitions.PropertyDefName2, AdProductDefValues.DefValue2

有了这个

Select New With { .Name = PropertyDefinitions.PropertyDefName2, _
                  .Value = AdProductDefValues.DefValue2 }

同样地:

Select New With { .Name = AdCustomProperties.PropertyTitle2, _
                  .Value = AdCustomProperties.PropertyValue2 }

答案 1 :(得分:1)

问题是每个序列都有不同的类型,所以你不能只是将2拼接在一起。如果您在.Cast<object>()来电之前对每个应用Concat,则应该按预期工作。

我认为如果将查询分成不同的变量会更清晰,那么这将是一个问题:

DataSource = query1.Cast<object>().Concat(query2.Cast<object>());

或者,您可以创建一个方法,将结果作为非泛型IEnumerable

返回
private IEnumerable GetData()
{
    var query1 = [query1 logic];
    foreach (var item in query1)
        yield return item;

    var query2 = [query2 logic];
    foreach (var item in query2)
        yield return item;
}
...
DataSource = GetData();

这不是很常见(使用像这样的无类型IEnumerable)但是对于数据绑定很有用,因为它基于反射(因此集合中项目的类型通常无关紧要)。

PS:对于C#特定的语法很抱歉,因为我不使用VB,如果我试着写这篇文章,可能会在这个过程中弄乱一些东西。