【问题标题】:Linq linq-to-entities add join if condition is met如果满足条件,Linq linq-to-entities 添加连接
【发布时间】:2011-07-01 20:29:03
【问题描述】:

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

如何避免此错误,和/或如果满足条件,实际上是否有添加连接的方法?

在此先感谢并为这个(我害怕愚蠢的)问题感到抱歉。

【问题讨论】:

  • 您发布的代码会编译,但Join() 不会做任何事情。你的意思是query = query.Join(…)
  • 哎呀,当然,谢谢...我有点累了;)

标签: linq join linq-to-entities


【解决方案1】:

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

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

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>

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

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

【讨论】:

  • 感谢您的回答,让我不再了解它对我的作用!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多