许多外部连接SQL到LINQ

时间:2017-01-09 14:19:40

标签: c# sql-server linq

尝试使用许多外连接重写SQL查询到Linq时很难。

这是查询:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration>
      <system.webServer>
        <caching enabled="true" enableKernelCache="true" maxCacheSize="1000" maxResponseSize="512000">
          <profiles>
            <add extension=".php" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
            <add extension=".js" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
            <add extension=".css" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
            <add extension=".gif" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
            <add extension=".jpg" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
          </profiles>
        </caching>
        <httpProtocol>
          <customHeaders>
            <remove name="Vary"></remove>
            <add name="Vary" value="Accept-Encoding"></add>
          </customHeaders>
        </httpProtocol>
        <staticContent>
          <clientCache cacheControlMode="DisableCache" />
        </staticContent>
        <urlCompression doStaticCompression="true" doDynamicCompression="false" />
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <clear />
                <add value="index.html" />
                <add value="index.asp" />
                <add value="index.aspx" />
                <add value="index.php" />
                <add value="default.php" />
                <add value="default.html" />
                <add value="Default.htm" />
                <add value="Default.asp" />
                <add value="index.htm" />
                <add value="Default.aspx" />
            </files>
        </defaultDocument>
        <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto" />
        <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
            <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
            <dynamicTypes>
                <add mimeType="text/*" enabled="true"/>
                <add mimeType="message/*" enabled="true"/>
                <add mimeType="application/javascript" enabled="true"/>
                <add mimeType="*/*" enabled="false"/>
            </dynamicTypes>
            <staticTypes>
                <add mimeType="text/*" enabled="true"/>
                <add mimeType="message/*" enabled="true"/>
                <add mimeType="application/javascript" enabled="true"/>
                <add mimeType="*/*" enabled="false"/>
            </staticTypes>
        </httpCompression>
      </system.webServer>
      <system.web>
          <sessionState mode="Off" />
      </system.web>
  </configuration>

我尝试了很多东西,这是其中之一,但它会产生很多错误:(loc已经声明,groupjoin中的类型推断失败,无法找到online2)

select on1.diskpath as d1,
on2.diskpath as d2,
of1.diskpath as d3,
of2.diskpath as d4,
on1.disknaam as n1,
on2.disknaam as n2,
of1.disknaam as n3,
of2.disknaam as n4
from tblstoragelocation
left join tblstoragedisks on1 on online1=on1.id
left join tblstoragedisks on2 on online2=on2.id
left join tblstoragedisks of1 on offline1=of1.id
left join tblstoragedisks of2 on offline2=of2.id where md5='xxx'";

那么如何将多个左外连接写入LINQ?

1 个答案:

答案 0 :(得分:1)

左外连接是通过.DefaultIfEmpty()方法实现的。

var q = 
    from iter_1 in collection_1
    join iter_2 in collection_2 on iter_1 equals iter_2 into join_1 
    from iter_2 in join_1.DefaultIfEmpty()
    join iter_3 in collection_3 on iter_2 equals iter_3 into join_2
    from iter_3 in join_2.DefaultIfEmpty()
    ...
    join iter_n in collection_n on iter_n_1 equals iter_n into join_n_1
    from iter_n in join_n_1.DefaultIfEmpty()
    select join_n_1;