我有两个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()
任何想法结合两个查询的结果?
答案 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,如果我试着写这篇文章,可能会在这个过程中弄乱一些东西。