2017-09-20 48 views
-1

什麼是最好的做法是子查詢轉換爲LINQ, 例如我用這個下面的查詢:如何提供SQL子查詢在LINQ

select VerID = (select top 1 x.INTERNALPACKINGSLIPID from 
        CUSTPACKINGSLIPVERSION x where a.RECID = x.CUSTPACKINGSLIPJOUR 
        order by x.VERSIONDATETIME desc), 
     c.LINENUM, c.RECID, * 
from CUSTPACKINGSLIPJOUR a inner join CUSTPACKINGSLIPTRANS c 
     on a.PACKINGSLIPID = c.PACKINGSLIPID 

回答

1

我模擬你的類數據庫以獲取語法正確。根據需要進行修改。沒有最好的方法。有些人喜歡使用Where而不是連接。我喜歡加入。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<CUSTPACKINGSLIPVERSIONs> CUSTPACKINGSLIPVERSION = new List<CUSTPACKINGSLIPVERSIONs>(); 
      List<CUSTPACKINGSLIPJOURs> CUSTPACKINGSLIPJOUR = new List<CUSTPACKINGSLIPJOURs>(); 
      List<CUSTPACKINGSLIPTRANSs> CUSTPACKINGSLIPTRANS = new List<CUSTPACKINGSLIPTRANSs>(); 

      var VerId = (from vId in CUSTPACKINGSLIPVERSION 
         join slipId in CUSTPACKINGSLIPJOUR on vId.INTERNALPACKINGSLIPID equals slipId.RECID 
         join cId in CUSTPACKINGSLIPTRANS on vId.INTERNALPACKINGSLIPID equals cId.PACKINGSLIPID 
         select new { vid = vId, slipId = slipId, cId = cId }) 
         .GroupBy(x => x.vid.VERSIONDATETIME) 
         .OrderBy(x => x.Key) 
         .FirstOrDefault() 
         .Select(x => new { linenum = x.cId.LINENUM, recid = x.cId.RECID }) 
         .ToList(); 
     } 
    } 
    public class CUSTPACKINGSLIPVERSIONs 
    { 
     public int INTERNALPACKINGSLIPID { get; set; } 
     public DateTime VERSIONDATETIME { get; set; } 
    } 
    public class CUSTPACKINGSLIPJOURs 
    { 
     public int RECID { get; set; } 
     public int PACKINGSLIPID { get; set; } 
    } 
    public class CUSTPACKINGSLIPTRANSs 
    { 
     public int PACKINGSLIPID { get; set; } 
     public int LINENUM { get; set; } 
     public int RECID { get; set; } 
    } 
} 
+0

我不知道如果我誤解你的查詢:返回'linenum'&'recid'的第一條記錄,但是OP在'SELECT'中有'*',表示他想要選擇所有'CUSTPACKINGSLIPJOUR'列,然後返回所有'LINENUM' +'RECID',並且只返回' INTERNALPACKINGSLIPID'。 –

+0

在這種情況下,我無法說出*的含義。它可能是一個屬性或100個屬性。原來選擇的前1次,再次我不能說這是一行還是多行。我盡我所能地發佈了大量的信息。 – jdweng

+0

我修改了代碼以按日期分組,以便獲取最新日期的所有行。 – jdweng

0

您在查詢中有這樣和我假定這是一個錯字:a.RECID = x.CUSTPACKINGSLIPJOUR因爲CUSTPACKINGSLIPJOUR是集名稱。因此,我用SomeId代替。但是這應該給你的想法:

在投影中做一個子查詢。您還需要通過降序進行訂購,然後獲取第一條記錄 - 這將與top 1類似。下面是該查詢:

var query = from a in CUSTPACKINGSLIPJOUR 
      join c in CUSTPACKINGSLIPTRANS on a.PACKINGSLIPID equals c.PACKINGSLIPID 
      select new 
      { 
       VerID = (from x in CUSTPACKINGSLIPVERSION 
         where a.RECID == x.SomeId select x) 
         .OrderByDescending(o => o.VERSIONDATETIME) 
         .First().INTERNALPACKINGSLIPID, 
       c.LINENUM, 
       c.RECID 
      }; 

您可以通過以下集合測試:

var CUSTPACKINGSLIPJOUR = new List<CUSTPACKINGSLIPJOUR> { new CUSTPACKINGSLIPJOUR { PACKINGSLIPID = 1, RECID = 1 }, 
     new CUSTPACKINGSLIPJOUR { PACKINGSLIPID = 2, RECID = 2 }}; 
     var CUSTPACKINGSLIPTRANS = new List<CUSTPACKINGSLIPTRANS> 
     { 
      new CUSTPACKINGSLIPTRANS { LINENUM = 1, RECID = 1, PACKINGSLIPID = 1 } 
     }; 
     var CUSTPACKINGSLIPVERSION = new List<CUSTPACKINGSLIPVERSION> 
     { 
      new CUSTPACKINGSLIPVERSION { INTERNALPACKINGSLIPID = 1, SomeId = 1, VERSIONDATETIME = DateTime.Today.AddDays(-1) }, 
      new CUSTPACKINGSLIPVERSION { INTERNALPACKINGSLIPID = 2, SomeId = 1, VERSIONDATETIME = DateTime.Today } 
     }; 

這將是相同的查詢,如果您使用的是DbSet<T>

0

假設有那些設置:

public class TBL_CUSTPACKINGSLIPVERSION 
{ 
    public int CUSTPACKINGSLIPVERSION_ID { get; set; } 
    public int INTERNALPACKINGSLIPID { get; set; } 
    public DateTime VERSIONDATETIME { get; set; } 
} 
public class TBL_CUSTPACKINGSLIPJOUR 
{ 
    public int RECID { get; set; } 
    public int PACKINGSLIPID { get; set; } 
} 
public class TBL_CUSTPACKINGSLIPTRANS 
{ 
    public int PACKINGSLIPID { get; set; } 
    public int LINENUM { get; set; } 
    public int RECID { get; set; } 
} 

var CUSTPACKINGSLIPVERSION = new List<TBL_CUSTPACKINGSLIPVERSION>(); 
var CUSTPACKINGSLIPJOUR = new List<TBL_CUSTPACKINGSLIPJOUR>(); 
var CUSTPACKINGSLIPTRANS = new List<TBL_CUSTPACKINGSLIPTRANS>(); 

然後如實施例在下面給出可以建立合併查詢(假定CUSTPACKINGSLIPVERSION_ID是在比較CUSTPACKINGSLIPJOUR & CUSTPACKINGSLIPTRANS之間使用的身份密鑰):

var query = (from a in CUSTPACKINGSLIPJOUR 
      join c in CUSTPACKINGSLIPTRANS 
      on a.PACKINGSLIPID equals c.PACKINGSLIPID 
      select new { 
       VerID = (from x in CUSTPACKINGSLIPVERSION 
          where a.RECID == x.CUSTPACKINGSLIPVERSION_ID // should be an identity column/primary key to compare with 
          orderby x.VERSIONDATETIME descending 
          select x).FirstOrDefault().INTERNALPACKINGSLIPID, 
       c.LINENUM, 
       c.RECID 
      }).ToList(); 

請注意,您的查詢在SELECT語句末尾包含*,這可能表示查詢將返回來自兩者的所有記錄涉及join條款的表格。如果你想返回的CUSTPACKINGSLIPJOUR整隻記錄,但不會返回所有CUSTPACKINGSLIPTRANS,包括aselect new聲明(整合的a.* SQL使用):

select new { 
    VerID = (from x in CUSTPACKINGSLIPVERSION 
      where a.RECID == x.CUSTPACKINGSLIPVERSION_ID // should be an identity column/primary key to compare with 
      orderby x.VERSIONDATETIME descending 
      select x).FirstOrDefault().INTERNALPACKINGSLIPID, 
    c.LINENUM, 
    c.RECID, 
    a // used if you want to return all records from CUSTPACKINGSLIPJOUR 
}).ToList();