2017-04-20 63 views
1

我需要動態生成SQL查詢中使用System.Linq.Dynamic這樣的:System.Linq.Dynamic - 使用select裏面WHERE語句

SELECT 
    [Extent1].[FromRevision] AS [FromRevision], 
    [Extent1].[Field1] AS [Field1], 
    [Extent1].[TillRevision] AS [TillRevision], 
    [Extent1].[Field2] AS [Field2], 
    [Extent1].[Date1] AS [Date1], 
    [Extent1].[LastChangeDate] AS [LastChangeDate], 
    [Extent1].[Field3] AS [Field3] 
    FROM [log].[MyTable] AS [Extent1] 
    WHERE (([Extent1].[FromRevision] <= @p__linq__0) AND ([Extent1].[TillRevision] > @p__linq__1) AND 
    (NOT EXISTS (SELECT 
     1 AS [C1] 
     FROM [log].[MyTable] AS [Extent2] 
     WHERE ([Extent2].[Field1] = [Extent1].[Field1]) AND ([Extent2].[FromRevision] <= @p__linq__2) AND ([Extent2].[TillRevision] > @p__linq__3) 
    ))) 

以上是通過LINQ的生成泛型IQueryable,這樣的代碼:

query.Where(o => 
      //ADDED 
      ( o.FromRevision <= tillRevision && 
       o.TillRevision > tillRevision && 
       !query.Any(o1 => 
        o1.Uid == o.Uid && 
        o1.FromRevision <= fromRevision && 
        o1.TillRevision > fromRevision) 
      ) 

但是有可能得到相同的結果,相同的SELECT結果使用Dynamic Linq而不是通用IQueryable?

+0

是否有你需要使用動態的LINQ,而不是建立自己的表述的原因是什麼? – NetMage

+0

是的,我不知道在設計時什麼類型會來這個構造函數,過濾器等等。 –

回答

2

您可以利用可選的params object[] values參數將一些參數傳遞給動態查詢(如query,tillRevisionfromRevision)。然後你可以在字符串內引用它們作爲@0@1@2根據它們的位置。

對於訪問範圍內的當前範圍變量,您可以使用it或不使用任何值。它將等於你的o變量。重要的細節是,當你輸入一個嵌套的範圍(如你的Any),在該範圍內it或什麼都不會引用你的o1變量。爲了訪問外部變量,你應該使用outerIt

這裏是動態LINQ相當於你的查詢,希望你能弄清楚如何動態地構建它:

var result = query.Where(
    "FromRevision <= @0 && TillRevision > @0 && [email protected](Uid == outerIt.Uid && FromRevision <= @1 && TillRevision > @1)", 
    tillRevision, // @0 
    fromRevision, // @1, 
    query // @2 
); 
+0

不幸的是,我在類型'MyType'中出現異常像「沒有屬性或字段'outerIt'」..似乎解析器將我的查詢參數轉換爲真實對象集合,並且不知道「outerIt」是什麼。有任何想法嗎?我發現outerIt語句存在一些問題,但現在確定它是我的情況.. –

+1

我不知道,它爲我工作。可能你是在舊版本?我已經使用Microsoft的System.Linq.Dynamic進行了測試,v1.0.6 –

+2

顯然,outerIt是一些版本實現的原始動態庫的擴展,nuget版本1.07應該有它,儘管它看起來像它可能還有其實施中的一個錯誤。 – NetMage