【问题标题】:Outer join in LINQ ProblemLINQ问题中的外部连接
【发布时间】:2009-10-14 04:31:15
【问题描述】:

我想用这个查询中的第二个连接语句执行外连接,我不断收到奇怪的错误! (一定是第三只红牛)

var Objeto = from t in Table1.All()
             join su in table2.All() on t.Id equals su.Id
             join tab2 in Table1.All() on t.PId equals tab2.Id //<-I want it here
             select new
             {
                 t.Field1,
                 SN = su.Field123,
                 PTN = tab2.FieldABC
              };

任何帮助将不胜感激。

[编辑] - 我忘了说我使用的是 SubSonic 3.0,错误似乎与 SubSonic 相关.....

【问题讨论】:

  • 您必须告诉我们“奇怪的错误”是什么,我们才能为您提供帮助
  • 你能提供一个样本有多个连接,其中只有一个是“外部”吗?
  • 当我这样做时,我得到:“'System.Linq.IQueryable1[&lt;&gt;f__AnonymousType12[f__AnonymousType02[x,a],System.Collections.Generic.IEnumerable1[w]]]'类型的表达式不是一个序列“

标签: c# linq subsonic3


【解决方案1】:

执行外连接需要两个步骤:

  1. 使用into 将加入转换为组加入
  2. 如果加入的结果集为空,则在组上使用DefaultIfEmpty() 生成您期望的null 值。

您还需要将null 支票添加到您的select

var Objeto = from t in Table1.All()
             join su in table2.All() on t.Id equals su.Id
             join tab2 in Table1.All() on t.PId equals tab2.Id into gj
             from j in gj.DefaultIfEmpty()
             select new
             {
                 t.Field1,
                 SN = su.Field123,
                 PTN = (j == null ? null : j.FieldABC)
              };

【讨论】:

  • 当我这样做时,我得到:“'System.Linq.IQueryable1[&lt;&gt;f__AnonymousType12[f__AnonymousType02[x,a],System.Collections.Generic.IEnumerable1[w]]]'类型的表达式不是一个序列“
  • 您使用的是什么 LINQ 提供程序?你确定它支持外连接吗?
  • Table1.All()和Table2.All()返回什么类型?通常,它们应该都是 IQueryable<_> 或 IEnumerable<_> - 看起来它们当前是混合的,这可能会使编译器感到困惑。
  • 它们都返回相同的类型,这似乎是 SubSonic 的问题。
  • 这是在 LINQ 中进行外部联接的正确方法,我的错误是由 SubSonic 引起的
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多