2009-02-04 64 views
2

我有一對多關係中的兩個表。 (產品和價格中斷定價)。在數據庫級別,我無法在兩個表之間創建關係。我把這兩張錶帶入LINQ並手動創建了關聯。LINQ to SQL:內部連接與SQL 2000上的手動關聯

我需要做一個大的LINQ查詢,並加入表格。我的問題是它沒有使用連接來獲取數據。 LINQ在主表上使用1選擇,然後1選擇該主表中的每一行。

Dim db As New LSSStyleDataContext(connString) 

Dim options As New DataLoadOptions() 
options.LoadWith(Function(c As commerce_product) c.commerce_qty_breaks) 
db.LoadOptions = options 

Dim dbProducts = (From prods In db.commerce_products).ToList 

有關爲什麼這可能是任何想法?謝謝! 保羅

編輯:這裏有兩個表:

CREATE TABLE [dbo].[commerce_product](
    [pf_id] [int] NOT NULL, 
    [name] [varchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS   
    [description] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [restricted] [varchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    CONSTRAINT [PK_commerce_product_1] PRIMARY KEY NONCLUSTERED 
(
    [pf_id] ASC 
) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

而其他表:

CREATE TABLE [dbo].[commerce_qty_break](
    [pf_id] [int] NOT NULL, 
    [sku] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [qty] [int] NOT NULL, 
    [list_price] [int] NOT NULL, 
    [break_id] [int] NOT NULL, 
    CONSTRAINT [PK_commerce_qty_break] PRIMARY KEY CLUSTERED 
    (
    [pf_id] ASC, 
    [qty] ASC, 
    [break_id] ASC 
    ) ON [PRIMARY] 
    ) ON [PRIMARY] 

的DBML是直的,只有兩張桌子前。我在兩個表之間創建了一個關聯,「commerce_product」是父項,「commerce_qty_break」是由「PF_ID」連接的子項。

我可以寫這樣的事:

Dim dbproducts = From prods In db.commerce_products _ 
    Join qtys In db.commerce_qty_breaks On prods.pf_id Equals qtys.pf_id _ 
    Select prods 

,我看到它連接在查詢表中,但只要我嘗試並旋通過「qty_breaks」它開始執行選擇獲得該信息。

我完全難住。

編輯2:這裏是DBML:

<?xml version="1.0" encoding="utf-8"?> 
<Database Name="LSScommerceDB_DevB" Class="LSSStyleDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007"> 
    <Connection Mode="AppSettings" ConnectionString="***" SettingsObjectName="HSLPriceUpdate.My.MySettings" SettingsPropertyName="LSScommerceDB_DevBConnectionString" Provider="System.Data.SqlClient" /> 
    <Table Name="dbo.commerce_product" Member="commerce_products"> 
    <Type Name="commerce_product"> 
     <Column Name="pf_id" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> 
     <Column Name="name" Type="System.String" DbType="VarChar(500)" CanBeNull="true" /> 
     <Column Name="description" Type="System.String" DbType="Text" CanBeNull="true" UpdateCheck="Never" /> 
     <Column Name="list_price" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="image_file" Type="System.String" DbType="VarChar(255)" CanBeNull="true" /> 
     <Column Name="image_width" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="image_height" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="sale_price" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="sale_start" Type="System.DateTime" DbType="DateTime" CanBeNull="true" /> 
     <Column Name="sale_end" Type="System.DateTime" DbType="DateTime" CanBeNull="true" /> 
     <Column Name="attr_label1" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="attr_label2" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="attr_label3" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="attr_label4" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="attr_label5" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="sku" Type="System.String" DbType="VarChar(100)" CanBeNull="true" /> 
     <Column Name="UOM" Type="System.String" DbType="VarChar(50)" CanBeNull="true" /> 
     <Column Name="Sell_Pack" Type="System.String" DbType="VarChar(50)" CanBeNull="true" /> 
     <Column Name="mfg_model_number" Type="System.String" DbType="VarChar(50)" CanBeNull="true" /> 
     <Column Name="mfg_id" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="logo_file" Type="System.String" DbType="VarChar(255)" CanBeNull="true" /> 
     <Column Name="drop_ship" Type="System.String" DbType="VarChar(50)" CanBeNull="true" /> 
     <Column Name="lead_time" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="hazard_flag" Type="System.String" DbType="VarChar(50)" CanBeNull="true" /> 
     <Column Name="publish_date" Type="System.DateTime" DbType="DateTime" CanBeNull="true" /> 
     <Column Name="restricted" Type="System.String" DbType="VarChar(5)" CanBeNull="true" /> 
     <Association Name="commerce_product_commerce_qty_break" Member="commerce_qty_breaks" ThisKey="pf_id" OtherKey="pf_id" Type="commerce_qty_break" /> 
    </Type> 
    </Table> 
    <Table Name="dbo.commerce_qty_break" Member="commerce_qty_breaks"> 
    <Type Name="commerce_qty_break"> 
     <Column Name="pf_id" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> 
     <Column Name="sku" Type="System.String" DbType="VarChar(100) NOT NULL" CanBeNull="false" /> 
     <Column Name="qty" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> 
     <Column Name="list_price" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" /> 
     <Column Name="sale_price" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
     <Column Name="sale_start" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" /> 
     <Column Name="sale_end" Type="System.DateTime" DbType="DateTime" CanBeNull="true" /> 
     <Column Name="break_id" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> 
     <Association Name="commerce_product_commerce_qty_break" Member="commerce_product" ThisKey="pf_id" OtherKey="pf_id" Type="commerce_product" IsForeignKey="true" /> 
    </Type> 
    </Table> 
</Database> 

編輯3:顯然,這是隻有在SQL 2000 SQL問題2008年工作正常。我有其他表在SQL 2000中進行急切加載,我無法弄清楚這兩個表之間的區別。

+0

你可以發佈你的DBML和實體定義的細節嗎? – RobS 2009-02-04 23:23:35

+0

我已更新問題以包含更多詳細信息。 – 2009-02-05 16:54:20

+0

你也可以彈出DBML嗎? Ta – RobS 2009-02-06 08:27:24

回答

0

我結束了使用實體框架,一切都很好。

0

哎,不知道我完全瞭解你的問題,但這裏的一些信息,

默認情況下的LINQ to SQL採用延遲綁定,這意味着它不會查詢數據庫中,直到需要。這就是爲什麼你得到多個查詢。

有一些事情你可以做,以避免在DB多命中:

  1. 您可以在LINQ延遲綁定在全球關閉到SQL設計師。但是如果你的表有任何關係,你總是會執行JOINS。

  2. 您在LINQ查詢中手動執行JOIN。如果你這樣做,你必須指定你想在LINQ查詢中返回哪些「字段」來取回JOINED數據。如果你這樣做,那麼你會返回一個匿名類型

注:的LINQ to SQL不支持左聯接。如果你谷歌LINQ到SQL左加入你會看到這個特定主題的大量信息

歡呼聲,祝你好運!

1

我創建了一個VB控制檯應用程序,並在此處創建了架構。

另外 - 關係是PK - > PK,這是否意味着它應該是一對一的關係?

我使用每行填充表格(見下文)並運行上面列出的代碼。我跑SQL事件探查器,它只能查詢一次:

SELECT [t0].[pf_id], [t0].[name], [t0].[description], [t0].[restricted], 
[t1].[pf_id] AS [pf_id2], [t1].[sku], [t1].[qty], [t1].[list_price], 
[t1].[break_id], (
SELECT COUNT(*) 
FROM [dbo].[commerce_qty_break] AS [t2] 
WHERE [t2].[pf_id] = [t0].[pf_id] 
) AS [value] 
FROM [dbo].[commerce_product] AS [t0] 
LEFT OUTER JOIN [dbo].[commerce_qty_break] AS [t1] ON [t1].[pf_id] = [t0].[pf_id] 
ORDER BY [t0].[pf_id], [t1].[qty], [t1].[break_id] 

我想,以確保數據的選項被強迫高載重,所以我增加了一些額外的代碼 - 這裏是我使用的完整的代碼(只有單查詢如上被曝):

Dim options As New DataLoadOptions() 

options.LoadWith(Function(c As commerce_product) c.commerce_qty_breaks) 
db.LoadOptions = options 

Dim dbProducts = (From prods In db.commerce_products).ToList 

Dim dbProduct = dbProducts.First().commerce_qty_breaks 
Dim x = dbProduct.First().list_price 

這裏的測試數據:

INSERT INTO [Test].[dbo].[commerce_product] ([pf_id],[name],[description],[restricted]) VALUES (1,'Test','Test','Test') 
GO 
INSERT INTO [Test].[dbo].[commerce_qty_break] ([pf_id],[sku],[qty],[list_price],[break_id]) VALUES (1,'22',1,1,1) 
GO 
0

轉到搶LINQPad。玩這樣的東西很棒。

你試過類似的東西嗎?

Dim dbproducts = From prods In db.commerce_products _ 
    Join qtys In db.commerce_qty_breaks On prods.pf_id Equals qtys.pf_id _ 
    Select new {prods, qtys}