如何使用方法语法在 linq to sql 中进行连接?

Posted

技术标签:

【中文标题】如何使用方法语法在 linq to sql 中进行连接?【英文标题】:How to do a join in linq to sql with method syntax? 【发布时间】:2011-03-14 03:48:40 【问题描述】:

我在 LINQ to SQL 示例中看到了很多关于如何在查询语法中进行连接的示例,但我想知道如何使用方法语法来做到这一点?例如我该怎么做以下

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new  SomeClass = sc, SomeOtherClass = soc 

.Join()?谁能说明或提供另一个简单的例子?

【问题讨论】:

【参考方案1】:
var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new  SomeClass = sc, SomeOtherClass = soc ;

相当于:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new
                       
                           SomeClass = sc,
                           SomeOtherClass = soc
                       );

如您所见,在连接方面,查询语法通常比 lambda 语法更具可读性。

【讨论】:

【参考方案2】:

Justin 正确地显示了在连接后跟 select 的情况下的扩展。如果你有其他东西,由于透明标识符,它会变得更加棘手 - C# 编译器用来传播连接的两半范围的机制。

所以稍微改变一下贾斯汀的例子:

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             where sc.X + sc.Y == 10
             select new  SomeClass = sc, SomeOtherClass = soc 

会被转换成这样的:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new  sc, soc )
    .Where(z => z.sc.X + z.sc.Y == 10)
    .Select(z => new  SomeClass = z.sc, SomeOtherClass = z.soc );

这里的z 是透明标识符——但因为它是透明的,所以在原始查询中看不到它:)

【讨论】:

【参考方案3】:

要在此处添加其他答案,如果您想使用 where 子句创建第三种不同类型的新对象(例如,不是您的实体框架对象),您可以这样做:

public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)

    using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
    
        var result = entityFrameworkObjectContext.SomeClass
            .Join(entityFrameworkObjectContext.SomeOtherClass,
                sc => sc.property1,
                soc => soc.property2,
                (sc, soc) => new sc, soc)
            .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
            .Select(s => new ThirdNonEntityClass 
            
                dataValue1 = s.sc.dataValueA,
                dataValue2 = s.soc.dataValueB
            )
            .ToList();
    

    return result;

    

特别注意在 Where 和 Select 子句中创建的中间对象。

请注意,这里我们还会查找任何具有与输入列表中的其中一个匹配的 property1 的连接对象。

我知道这比最初的提问者所寻找的要复杂一些,但希望它会对某人有所帮助。

【讨论】:

以上是关于如何使用方法语法在 linq to sql 中进行连接?的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)

LINQ to SQL 中的内部联接的语法是啥?

如何使用linq to sql一次更新多行?

Linq to SQL 的增删改查操作

LINQ to SQL 调用 SQL Server 的系统函数

Linq to Sql:多个左外连接