如果满足条件,Linq linq-to-entities将添加连接

时间:2011-07-01 20:29:04

标签: linq join linq-to-entities

我对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>”。存在显式转换(您是否错过了演员?)

如何避免此错误,和/或是否实际上有条件在条件满足时添加联接?

提前致谢并抱歉(我害怕愚蠢)的问题。

2 个答案:

答案 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()的结果是一种类型,与原始查询的类型不同。条件处理变量后的代码应该如何?它可以包含两种不同类型中的一种。所以,这样做是不可能的。