【问题标题】:LINQ SQL: Left Outer Join on 2 ParametersLINQ SQL:2 个参数的左外连接
【发布时间】:2011-03-18 10:33:51
【问题描述】:

我正在尝试对 2 个参数进行 Left Out Join,但失败得很惨。

基本上,我需要的是

DECLARE @SomeValue
SET @SomeValue = 99

SELECT * FROM
[Table1] LEFT OUTER JOIN [Table2]
ON ([Table1].[Field1]=[Table2].[Field1] AND [Table2].[Field2]=@SomeValue)

如何使用 LINQ 做到这一点?

【问题讨论】:

    标签: asp.net sql linq linq-to-sql


    【解决方案1】:

    第二次...不确定我是否完全喜欢这个解决方案 - 但一种方法是:

    var someValue = 99;
    var preQuery = from t2 in Table2
                   where t2.Field2 == someValue
                   select t2;
    
    var query = from t1 in Table1
                join t2 in preQuery on t1.Field1 equals t2.Field1
                select new
                {
                   T1 = t1,
                   T2 = t2.FirstOrDefault()
                };
    

    【讨论】:

    • 嗯。像这样的东西会起作用,但我也不喜欢它:-P .. 谢谢你 :)
    【解决方案2】:

    LINQ to SQL:

    int someValue = 99; 
    var query =
        from table1 from dc.Table1Items
        join table2 from dc.Table2Items
        on new { table1.Field1, Field2 = someValue } equals new { table2.Field1, table2.Field2 } into table2Items
        from table2 in table2Items.DefaultIfEmpty()
        select new
        {
           table1,
           table2,
        };
    

    【讨论】:

    • 试过这个,我得到这个错误:连接子句中的表达式之一不正确。调用“GroupJoin”时类型推断失败。
    • @Steve Kiss 我的错,忘记将第二个属性命名为 Field2。已编辑。
    • @Steve Kiss Field2 是什么类型?如果是字符串,我们可以将其更改为:Field2 = someValue.ToString()。或者,如果 table1 和 table2 中的 Field1 不一样?
    • @Torbjörn:所有字段都是整数
    【解决方案3】:
    var someValue = 99;
    var query = from t1 in Table1
                join t2 in Table2 
                on t1.Field1 equals t2.Field1 into tempTable
                from t3 in tempTable.Where(v => v.Field2 == someValue).DefaultIfEmpty()
                select new { t1, t3};
    

    【讨论】:

      【解决方案4】:

      这是我最喜欢的左外连接语法:

      from t1 in Table1
      from t2 in Table2
          .Where(x => x.Field1 == t1.Field1 &&
                      x.Field2 == someValue)
          .DefaultIfEmpty()
      select new { t, t2 }
      

      【讨论】:

        【解决方案5】:

        假设你想在 Linq 中这样做:

        var someValue = 99;
        var qry = from t1 in Table1
                  join t2 in Table2 on t1.Field1 equals t2.Field1 into tempTable
                  from t3 in tempTable.FirstOrDefault()
                  where (t3==null || t3.Field2 == someValue)
                  select new
                  {
                      T1 = t1,
                      T2 = t3
                  };
        

        【讨论】:

        • 这样做会给我一个 INNER JOIN。我需要的是一个 LEFT OUTER JOIN,我从表 1 中获取所有元素。
        • 抱歉 - 错过了 - 用一个选项编辑了答案 - 不确定我 100% 喜欢它
        • 这根本行不通:-P。在这种情况下,t3 是 IEnumerable 类型。
        • Eeek - 我需要把它放到 LinqPad 中!尝试过 FirstOrDefault 而不是 DefaultIfEmpty!
        【解决方案6】:
        var query = from t1 in table1 join t2 in table2 equals t2.field2 = @somevalue into new table
                from t in table.DefaultIfEmpty() select new { t1, t2== null ? t1.field : t2.field };
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 2013-09-09
          • 2013-06-13
          • 1970-01-01
          相关资源
          最近更新 更多