2012-05-10 11 views
6

में डेटा होने पर क्वेरी कुछ भी वापस नहीं लौटा रहा है मैं आलसी फ्रेमवर्क 4 + उत्पन्न पॉको का उपयोग आलसी लोडिंग अक्षम के साथ करता हूं।
मान लें कि तालिका 1, तालिका 2, तालिका 3 और तालिका 4 नामक एसक्यूएल टेबल हैं और मान लें कि उनमें कुछ डेटा है।
मान लेते हैं इन तालिकाओं के सरलीकृत POCO प्रतिनिधित्व इस तरह दिखता है:डेटाबेस

public class Table1 
{ 
    public int ID; 
    public DateTime TableDate; 
    public int Table2ID; 
    public Table2 Table2; 
    public ICollection<Table3> Table3s; 
} 

public class Table2 
{ 
    public int ID; 
    public string SomeString; 
    public int Table4ID; 
    public Table4 Table4; 
} 

public class Table3 
{ 
    public int ID; 
    public int Table1ID; 
    public Table1 Table1; 
    public decimal SomeDecimal; 
} 

public decimal Table4 
{ 
    public int ID; 
    public string SomeName; 
} 

निम्न कोड निष्पादित किया जाएगा, तो:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[TableDate] AS [TableDate], 
[Extent1].[Table2ID] As [Table2ID] 
FROM [dbo].[Table1] AS [Extent1] 
WHERE ([Extent1].[TableDate] >= @p__linq__0)',N'@p__linq__0 datetime2(7)',@p__linq__0='0001-01-01 00:00:00' 
:

Database DB = new Database(); // object context 
var result = DB.Table1 
    .Where(x => x.TableDate >= DateTime.MinValue); 

एफई निम्नलिखित एसक्यूएल बयान उत्पन्न होगा

और क्वेरी की उम्मीद डेटा लौट आते हैं।
हालांकि, निम्न कोड निष्पादित करता है, तो होगा:

Database DB = new Database(); // object context 
var result = DB.Table1 
    .Include("Table2") 
    .Include("Table2.Table4") 
    .Include("Table3") 
    .Where(x => x.TableDate >= DateTime.MinValue); 

एफई निम्नलिखित एसक्यूएल बयान उत्पन्न होगा:

exec sp_executesql N'SELECT 
[Project1].[ID2] AS [ID], 
[Project1].[ID] AS [ID1], 
[Project1].[TableDate] AS [TableDate], 
[Project1].[ID1] AS [ID2], 
[Project1].[SomeString] AS [SomeString], 
[Project1].[Table4ID] AS [Table4ID], 
[Project1].[ID3] AS [ID3], 
[Project1].[SomeName] AS [SomeName], 
[Project1].[ID4] AS [ID4], 
[Project1].[SomeDecimal] AS [SomeDecimal], 
[Project1].[Table1ID] AS [Table1ID] 
FROM (SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[TableDate] AS [TableDate], 
[Extent2].[ID] AS [ID1], 
[Extent2].[SomeString] AS [SomeString], 
[Extent2].[Table4ID] AS [Table4ID], 
[Extent3].[ID] AS [ID2], 
[Extent4].[ID] AS [ID3], 
[Extent4].[SomeName] AS [SomeName], 
[Extent5].[ID] AS [ID4], 
[Extent5].[SomeDecimal] AS [SomeDecimal], 
[Extent5].[Table1ID] AS [Table1ID], 
CASE WHEN ([Extent5].[ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
FROM  [dbo].[Table1] AS [Extent1] 
INNER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Table2ID] = [Extent2].[ID] 
LEFT OUTER JOIN [dbo].[Table2] AS [Extent3] ON [Extent1].[Table2ID] = [Extent3].[ID] 
LEFT OUTER JOIN [dbo].[Table4] AS [Extent4] ON [Extent3].[Table4ID] = [Extent4].[ID] 
LEFT OUTER JOIN [dbo].[Table3] AS [Extent5] ON [Extent1].[ID] = [Extent5].[Table1ID] 
WHERE ([Extent1].[TableDate] >= @p__linq__0) 
) AS [Project1] 
ORDER BY [Project1].[ID2] ASC, [Project1].[ID] ASC, [Project1].[ID1] ASC, [Project1].[ID3] ASC, [Project1].[C1] ASC',N'@p__linq__0 datetime2(7)',@p__linq__0='0001-01-01 00:00:00' 

और क्वेरी कुछ भी नहीं लौट आते हैं।

क्यों यह हो रहा जा सकता है?

संपादित

के बाद ऊपर तालिकाएं बनाने के लिए SQL कथन हैं:

CREATE TABLE [dbo].[Table1](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[Table2ID] [int] NOT NULL, 
[TableDate] [date] NOT NULL, 
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD CONSTRAINT [FK_Table1_Table2] FOREIGN KEY([Table2ID]) 
REFERENCES [dbo].[Table2] ([ID]) 

ALTER TABLE [dbo].[Table1] CHECK CONSTRAINT [FK_Table1_Table2] 

CREATE TABLE [dbo].[Table2](
[ID] [int] NOT NULL, 
[SomeString] [nvarchar](50) NOT NULL, 
[Table4ID] [int] NULL, 
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Table2] WITH NOCHECK ADD CONSTRAINT [FK_Table2_Table4] FOREIGN KEY([Table4ID]) 
REFERENCES [dbo].[Table4] ([ID]) 
ON UPDATE CASCADE 

ALTER TABLE [dbo].[Table2] CHECK CONSTRAINT [FK_Table2_Table4] 

CREATE TABLE [dbo].[Table3](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[SomeDecimal] [decimal](18, 4) NOT NULL, 
[Table1ID] [int] NOT NULL, 
CONSTRAINT [PK_Table3] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Table3] WITH NOCHECK ADD CONSTRAINT [FK_Table3_Table1] FOREIGN KEY([Table1ID]) 
REFERENCES [dbo].[Table1] ([ID]) 
ON DELETE CASCADE 

ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table1] 

CREATE TABLE [dbo].[Table4](
[ID] [int] NOT NULL, 
[SomeName] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Table4] PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

संपादित 2

इस क्वेरी भी कोई रिकॉर्ड वापस आ जाएगी और एक न्यूनतम उदाहरण के रूप में सेवा कर सकते हैं :

Database DB = new Database(); 
var result = DB.Table1 
    .Include("Table2") 
    .Where(x => x.TableDate >= DateTime.MinValue); 

जेनरेट किए गए एसक्यूएल:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Table2ID] AS [Table2ID], 
[Extent1].[TableDate] AS [TableDate], 
[Extent2].[ID] AS [ID1], 
[Extent2].[SomeString] AS [SomeString], 
[Extent2].[Table4ID] AS [Table4ID], 
FROM [dbo].[Table1] AS [Extent1] 
INNER JOIN [dbo].[Table2] AS [Extent2] ON [Extent1].[Table2ID] = [Extent2].[ID] 
WHERE ([Extent1].[TableDate] >= @p__linq__0)',N'@p__linq__0 datetime2(7)',@p__linq__0='0001-01-01 00:00:00' 

साथ ही, यहां .edmx से एक अंश है:

<EntityContainer> 
     <AssociationSet Name="FK_Table1_Table2" Association="MyModel.Store.FK_Table1_Table2"> 
     <End Role="Table2" EntitySet="Table2" /> 
     <End Role="Table1" EntitySet="Table1" /> 
     </AssociationSet> 
</EntityContainer> 

<!-- ... --> 

<EntityType Name="Table2"> 
    <Key> 
    <PropertyRef Name="ID" /> 
    </Key> 
    <Property Name="ID" Type="int" Nullable="false" /> 
    <Property Name="SomeString" Type="nvarchar" Nullable="false" MaxLength="50" /> 
    <Property Name="Table4ID" Type="int" /> 
</EntityType> 

<!-- ... --> 

<EntityType Name="Table1"> 
    <Key> 
    <PropertyRef Name="ID" /> 
    </Key> 
    <Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
    <Property Name="TableDate" Type="date" Nullable="false" /> 
    <Property Name="Table2ID" Type="int" Nullable="false" /> 
</EntityType> 

<!-- ... --> 

<Association Name="FK_Table1_Table2"> 
    <End Role="Table2" Type="MyModel.Store.Table2" Multiplicity="1" /> 
    <End Role="Table1" Type="MyModel.Store.Table1" Multiplicity="*" /> 
    <ReferentialConstraint> 
    <Principal Role="Table2"> 
     <PropertyRef Name="ID" /> 
    </Principal> 
    <Dependent Role="Table1"> 
     <PropertyRef Name="Table2ID" /> 
    </Dependent> 
    </ReferentialConstraint> 
</Association> 
+3

कुछ समझदार है अगर इसे 'तालिका 1' से 'तालिका 2' में 'LEFT' में शामिल होने के बजाय' INNER' की आवश्यकता है। क्या आप हमें एसक्यूएल स्कीमा के बारे में अधिक बता सकते हैं, या कम से कम उदाहरण में आ सकते हैं जो गलत हो जाता है? – AakashM

+0

कृपया मैपिंग दिखाएं जिसका आप उपयोग कर रहे हैं। –

+0

मैंने उपरोक्त तालिकाओं को बनाने के लिए SQL कथन के साथ प्रश्न संपादित किया है। इस बीच मैं कम से कम उदाहरण प्राप्त करने की कोशिश करूंगा जो गलत हो जाता है। –

उत्तर

1

ऐसा प्रतीत होता है कि SQL सर्वर में वास्तविक डेटा असंगत होने में यह एक समस्या थी।
के रूप में कहा गया है there,

अंदरूनी शामिल हों कीवर्ड वापसी पंक्तियों जब वहाँ दोनों तालिकाओं में कम से कम एक मैच है। "Table1" में पंक्तियों "तालिका 2" में मैच नहीं है कि देखते हैं, तो उन पंक्तियों को सूचीबद्ध नहीं किये जाएंगे।

इस क्वेरी को असफल होने का कोई कारण नहीं है, जब तक कि "तालिका 2" में कोई पंक्ति नहीं है, जो "तालिका 1" से मेल खाती है।हालांकि यह अजीब है, क्योंकि एफके बाधाओं को लागू किया जाता है, लेकिन यह एक और सवाल का हकदार है और यह मामला बंद है।

0

मेरा अनुमान है कि शामिल करें() रों आपकी क्वेरी उत्पन्न कर रहे हैं क्रम में मूल्यांकन नहीं करने के लिए है आप, उम्मीद थी इसलिए TableDate उपलब्ध है जब आपके कहाँ() कहा जाता है नहीं है। क्या होगा यदि आप मूल्यांकन के लिए मजबूर है, तो फोन अपने कहाँ()?