簡體   English   中英

如何在C#中使用Linq在Sql中進行條件連接?

[英]How to do a Conditional Join in Sql using Linq in C#?

我試圖將Sql查詢傳遞給C#LINQ連接。 我試過但我無法做到這一點。 SQL中的相應查詢按原樣運行:

SELECT pj01.CLID from us20
INNER JOIN pj01 ON pj01.PJID = 
( 
     CASE 
     WHEN (us20.BKNM = 'PJID')

     THEN us20.BKID

     WHEN (us20.BKNM = 'PSID')

     THEN 
     (
         SELECT PJID FROM pj02 WHERE CLID = us20.CLID AND PSID = us20.BKID
     ) 
     END 
)

我的Linq嘗試,這不起作用 - 數據不來:

var result = 
         from us20 in Us20Repository.GetAll()
         join pj01 in Pj01Repository.GetAll() on new
         {
             PJID =
             (us20.BKNM == "PJID" ?
                    us20.BKID :
                    (
                       us20.BKNM == "PSID" ?
                       (
                         (from pj02 in Pj02Repository.GetAll()
                         where
                              pj02.CLID == us20.CLID &&
                              pj02.PSID == us20.BKID
                         select new
                         {
                               PJID = pj02.PJID
                         }).First().PJID
                      ) :
                      ""
                   )
             )
         } equals new { PJID = pj01.PJID }
         select new
         {
             CLID = pj01.CLID
         };

我怎樣才能做到這一點? 這可能嗎?

這是一個示例語法。 希望這會有所幫助

dbContext.SourceTable         // source
                      .Join(dbContext.TargetTable,         // target
                                        source=> source.Id,          // FK
                                        target=> target.Id,   // PK
                                        (source, target) => new { source= source,target=target}).Where(x=>x.source.somefield!=x.target.somefield) // project result
                                    .Select(x => x.source); //the output 

默認情況下,匿名類型不支持聰明的Equals實現,而只是使用Object.Equals ,這就是為什么對我來說查詢沒有返回任何結果是完全有意義的。 如果您的LINQ-Provider無法將查詢轉換為SQL但在本地運行連接,那么這將是完全合理的。 嘗試在連接運算符中省略匿名類型:

var result = 
     from us20 in Us20Repository.GetAll()
     join pj01 in Pj01Repository.GetAll() on 
         (us20.BKNM == "PJID" ?
                us20.BKID :
                (
                   us20.BKNM == "PSID" ?
                   (
                     (from pj02 in Pj02Repository.GetAll()
                     where
                          pj02.CLID == us20.CLID &&
                          pj02.PSID == us20.BKID
                     select new
                     {
                           PJID = pj02.PJID
                     }).First().PJID
                  ) :
                  ""
               )
         )
     equals pj01.PJID
     select new
     {
         CLID = pj01.CLID
     };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM