我对c#和EF很新,我找不到下一个问题的答案,原谅我应该忽略一个。
我想加入一个“主查询”query1,其中有几个“可选查询”,它们会转到同一模型中的不同表中,我该如何实现呢?
如果我尝试使用Join()方法,只要我这样做就可以了:
var query = query1.Join(query2 [...]);
但尝试类似
时query = query1;
if (condition_is_met)
{
query = query.Join(query2 [...]);
}
我收到错误
无法将类型“
System.Linq.IQueryable<AnonymousType#1>
”隐式转换为“System.Collections.Generic.IEnumerable<someentity>
”。存在显式转换(您是否错过了演员?)
如何避免此错误,和/或是否实际上有条件在条件满足时添加联接?
提前致谢并抱歉(我害怕愚蠢)的问题。
答案 0 :(得分:2)
您可以有条件地添加到查询中,但是您需要了解一旦输入查询后,您就无法将其类型更改为其他内容。您的问题是您的一个查询类型为匿名类型,另一个类型为实体,并且不一致。
有关可行的示例,请参阅:
var query = context.Foos.AsQueryable();
if (DateTime.Now.Second % 2 == 0)
{
query = query.Join(context.Bars, f => f.BarId, b => b.Id, (f, b) => new { f, b }).Select(item => item.f);
}
else
{
query = query.OrderByDescending(f => f.Id);
}
这样做的原因是初始声明是IQueryable<Foo>
,并且每个结果查询(加入或订购版本)仍然是IQueryable<Foo>
。
如果您需要将查询结果投影为匿名类型,我建议将其保存到以后的步骤(查询构造的查询)。构建所有联接,过滤,订单等,然后最终提取您的匿名类型。只要您的类型与您所包含的其他逻辑无关,您就可以构建单个查询。
但是,如果逻辑影响您实际检索的数据的形状,那么那就是您运气不好的地方,您需要转向另一个方向。
答案 1 :(得分:0)
那是因为Join()
的结果是一种类型,与原始查询的类型不同。条件处理变量后的代码应该如何?它可以包含两种不同类型中的一种。所以,这样做是不可能的。