2014-03-12 67 views
1

我正在使用BLToolKit作爲ORM映射器。BLToolKit生成錯誤的SQL

我現在的問題是,它會產生錯誤的SQL。

我有此查詢:

var qry = from i in s.Query<ChannelDTO>() 
      join o in s.Query<StorageShelfDTO>() on i.Id equals o.ChannelID into p1 
      select new {i.Id, n = p1.Count()}; 

     var qry2 = qry; 
     qry2 = qry2.Where(x => x.n == 0); 
     Debug.Print("Entrys: " + qry2.ToList().ToString()); 

至極生成此SQL:

SELECT 
[x].[Id] as [Id1] 
FROM 
(
SELECT 
    (
     SELECT 
      Count(*) 
     FROM 
      [WMS_StorageShelf] [t1] 
     WHERE 
      [i].[ID] = [t1].[ChannelID] 
    ) as [c1], 
    [i].[ID] as [Id] 
FROM 
    [WMS_Channel] [i] 
) [x] 
WHERE 
[x].[c1] = 0 

至極缺少計數字段外選擇!

但是當我刪除的條件:

qry2 = qry2.Where(x => x.n == 0); 

那麼正確的SQL是Gnerated

回答

0

生成的查詢是正確的。

你有你的初始LINQ聲明:

var qry = from i in s.Query<ChannelDTO>() 
      join o in s.Query<StorageShelfDTO>() on i.Id equals o.ChannelID into p1 
      select new {i.Id, n = p1.Count()}; 

,將產生SQL類似於:

SELECT 
    (
     SELECT 
      Count(*) 
     FROM 
      [WMS_StorageShelf] [t1] 
     WHERE 
      [i].[ID] = [t1].[ChannelID] 
    ) as [c1], 
    [i].[ID] as [Id] 
FROM 
    [WMS_Channel] [i] 

現在,當你第二部分添加到您的查詢(qry2),這將被添加上到您的原始查詢,因爲它使用延遲執行。爲此在執行時是被由這個樣子的最終查詢:

var finalQuery = (from i in s.Query<ChannelDTO>() 
       join o in s.Query<StorageShelfDTO>() on i.Id equals o.ChannelID into p1 
       select new {i.Id, n = p1.Count()}).Where(x => x.n == 0) 

這就是爲什麼你的SQL生成事情是這樣的。

如果您不想延遲執行並實際需要兩個不同的查詢,請在第一個查詢上調用.ToList()以強制立即執行,您將看到您所期望的查詢。

像這樣:

var qry = (from i in s.Query<ChannelDTO>() 
      join o in s.Query<StorageShelfDTO>() on i.Id equals o.ChannelID into p1 
      select new {i.Id, n = p1.Count()}).ToList(); 
+0

我知道有derferd執行,也這就是我想要的!但外部選擇缺少計數,因此值不會填充結果!確定當我過濾== 0這個工程,但當我過濾如> 0它也沒有填充 –