如果满足条件,Linq Linq to实体添加联接

如果满足条件,Linq Linq to实体添加联接,linq,join,linq-to-entities,Linq,Join,Linq To Entities,我对c#和EF很陌生,我找不到以下问题的答案,请原谅我忽略了一个 我想将一个“主查询”查询1与几个“可选查询”连接起来,这些查询在同一个模型中指向不同的表,我应该如何实现 如果我尝试使用Join()方法,只要我这样做,它就会工作: var query = query1.Join(query2 [...]); 但是当你尝试像 query = query1; if (condition_is_met) { query = query.Join(query2 [...]); } 我收到一

我对c#和EF很陌生,我找不到以下问题的答案,请原谅我忽略了一个

我想将一个“主查询”查询1与几个“可选查询”连接起来,这些查询在同一个模型中指向不同的表,我应该如何实现

如果我尝试使用Join()方法,只要我这样做,它就会工作:

var query = query1.Join(query2 [...]);
但是当你尝试像

query = query1;

if (condition_is_met)
{
    query = query.Join(query2 [...]);
}
我收到一个错误

无法将类型“
System.Linq.IQueryable
”隐式转换为“
System.Collections.Generic.IEnumerable
”。存在显式转换(是否缺少强制转换?)

如何避免此错误,和/或在满足条件时是否有添加联接的方法


提前感谢您,并为(我恐怕是愚蠢的)问题感到抱歉。

这是因为
Join()
的结果是一种类型,与原始查询的类型不同。条件后的代码应该如何处理变量?它可以包含两种不同类型中的一种。因此,这样做是不可能的。

您可以有条件地添加到查询中,但您需要了解,一旦您的查询被键入,您就不能将其类型更改为其他类型。您的问题是,其中一个查询类型为匿名类型,另一个查询类型为实体,这是不一致的

有关有效的示例,请参见:

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
,而每个结果查询(连接或排序版本)仍然是一个
IQueryable

如果需要将查询结果投影到匿名类型,我建议将其保存到以后的步骤中(对已构造查询的查询)。构造所有的连接、过滤、订单等,然后最终提取匿名类型。只要您的类型是相同的,而不考虑您所包含的其他逻辑,您就可以基于单个查询进行构建


但是,如果逻辑影响实际检索的数据的形状,那么这就是你运气不佳的地方,你需要转向另一个方向。

你发布的代码可以编译,但是
Join()
不会做任何事情。你是说
query=query.Join(…)
?哦,当然,谢谢你。。。我有点累;)谢谢你的回答,让我明白了它对我的作用!