none
[Linq To SQL] Not Exists RRS feed

  • 問題

  • NorthwindDataContext dc = new NorthwindDataContext();
    
    dc.Log = Console.Out;
    
    var query =
    
        from c in dc.Customers
    
        where !(from o in dc.Orders
    
                select o.CustomerID)
    
               .Contains(c.CustomerID)
        select c;
    以上為C# Linq to SQL 的Not Exists,若改為vb該怎麼寫呢?
    試過在第一個 where 後「!」改為 Not 但會出現「not 運算子未定義」錯誤。

    2009年7月31日 上午 08:04

解答

  • http://msdn.microsoft.com/en-us/library/bb397978.aspx
    這是VB版的,跟我看的C#範例一樣.
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 05:18
  • HI,

    看看這樣是否OK?

    Dim query = From c In dc.Customers() _
                        Where Not (From o In dc.Orders _
                        Select o.CustomerID).Contains(c.CustomerID) _
                        Select c
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 07:05
  • 建議您也可以試看看用Except去排除:

    Except
    http://msdn.microsoft.com/zh-tw/library/bb300779.aspx
    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 08:04
  • 不好意思的確這些網站沒有支援LINQ,我幫您TRY了一下,可以用ANY方法達到您要的效果,程式碼片段如下:
    Using context As New NorthwindEntities
       Dim customer As ObjectQuery(Of Customers) = context.Customers
       Dim query = From c In customer _
                          Where Not c.Orders.Any() _
                           Select c
       For Each q In query
             Response.Write(q.CustomerID + "<br/>")
       Next
    End Using


    SELECT 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[CompanyName] AS [CompanyName], 
    [Extent1].[ContactName] AS [ContactName], 
    [Extent1].[ContactTitle] AS [ContactTitle], 
    [Extent1].[Country] AS [Country], 
    [Extent1].[CustomerID] AS [CustomerID], 
    [Extent1].[Fax] AS [Fax], 
    [Extent1].[Phone] AS [Phone], 
    [Extent1].[PostalCode] AS [PostalCode], 
    [Extent1].[Region] AS [Region]
    FROM [dbo].[Customers] AS [Extent1]
    WHERE  NOT EXISTS (SELECT 
    	cast(1 as bit) AS [C1]
    	FROM [dbo].[Orders] AS [Extent2]
    	WHERE [Extent1].[CustomerID] = [Extent2].[CustomerID]
    )

    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月4日 上午 08:00

所有回覆

  • 感謝 TerryChuang 回覆~
    已試過這些網站,但對LINQ的轉換似乎不是很完整,
    所以才會提出這個問題。
    2009年8月3日 上午 02:13
  • 你用研究語法轉換!意義?
    你不如去學語意轉換.
    你把VB 的LINQ學好,再去看C#範例就能轉了.

    2009年8月3日 上午 03:34
  • 因為大部份LINQ都是用C#寫的,VB的似乎不多!
    2009年8月3日 上午 04:33
  • http://msdn.microsoft.com/en-us/library/bb397978.aspx
    這是VB版的,跟我看的C#範例一樣.
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 05:18
  • HI,

    看看這樣是否OK?

    Dim query = From c In dc.Customers() _
                        Where Not (From o In dc.Orders _
                        Select o.CustomerID).Contains(c.CustomerID) _
                        Select c
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 07:05
  • 建議您也可以試看看用Except去排除:

    Except
    http://msdn.microsoft.com/zh-tw/library/bb300779.aspx
    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月3日 上午 08:04
  • 不好意思的確這些網站沒有支援LINQ,我幫您TRY了一下,可以用ANY方法達到您要的效果,程式碼片段如下:
    Using context As New NorthwindEntities
       Dim customer As ObjectQuery(Of Customers) = context.Customers
       Dim query = From c In customer _
                          Where Not c.Orders.Any() _
                           Select c
       For Each q In query
             Response.Write(q.CustomerID + "<br/>")
       Next
    End Using


    SELECT 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[CompanyName] AS [CompanyName], 
    [Extent1].[ContactName] AS [ContactName], 
    [Extent1].[ContactTitle] AS [ContactTitle], 
    [Extent1].[Country] AS [Country], 
    [Extent1].[CustomerID] AS [CustomerID], 
    [Extent1].[Fax] AS [Fax], 
    [Extent1].[Phone] AS [Phone], 
    [Extent1].[PostalCode] AS [PostalCode], 
    [Extent1].[Region] AS [Region]
    FROM [dbo].[Customers] AS [Extent1]
    WHERE  NOT EXISTS (SELECT 
    	cast(1 as bit) AS [C1]
    	FROM [dbo].[Orders] AS [Extent2]
    	WHERE [Extent1].[CustomerID] = [Extent2].[CustomerID]
    )

    • 已標示為解答 Lolota Lee 2009年8月5日 上午 06:59
    2009年8月4日 上午 08:00
  • Dim customerIDs() = {"ALFKI", "VICTE", "BLAUS", "TRAIH"}

    Dim customerList = From cust In customers, custID In customerIDs _
                       Where cust.CustomerID = custID _
                       Select cust.CompanyName

    For Each companyName In customerList
      Console.WriteLine(companyName)
    Next


    這是從
    http://msdn.microsoft.com/en-us/library/bb397978.aspx
    某個連結抓下來的,大概花2分鐘找到.所以我說不用去背語法,要懂語意.我當然沒有研究VB的語法.但看一下這個因該是我那個範例.
    2009年8月4日 上午 08:22
  • 感謝 tihs 、 TerryChuang、 Lolota Lee及好說,
    這些方法都能達成以上的例子,謝謝各位的幫忙,
    *另提供一個方法,如果都試不出就用Linq 去使用sp。
    2009年8月5日 上午 03:57