2013-01-11 82 views
0

如何做到動態對比Linq中的使用字符串字段,以SQL爲獲得類似的查詢:如何使用字符串字段在Linq to SQL中進行動態比較?

"SELECT COLUMN_1, COLUMN_2" + 
"FROM "+ stringTABLE + 
"WHERE " + stringCOLUMN_1_or2 + " = ' " + 8 + "'"; 

我知道我可以這樣:

from x in objects 
where x.COLUMN_1 == "8" 
select x 

但是場是可變的,可COLUMN_1或COLUMN_2" 或其他...

因爲什麼,我想在Windows窗體做榜樣(框架4.0)

from x in objets 
where x.field[stringCOLUMN_1_or2] == "8" 
select x 

我該怎麼做? 由於事先

+0

看來你想'linq to sql dynamic' http://stackoverflow.com/questions/697345/linq-to-sql-need-dynamic-where-clause-over-relational-tables-help – spajce

+0

'其中x.field [stringCOLUMN_1] ==「8」' - 但我不完全相信我遵循您的問題 –

+0

注意:「... COLUMN_2」+「FROM ...」產生無效查詢。 (也是'... stringTABLE +'where''除非stringTABLE以'''結尾 – 2013-01-11 19:38:33

回答

3

通常情況下,LINQ到SQL將創建一個名爲與您的列,因此您的LINQ很可能是這樣的屬性:

from x in objets 
where x.stringCOLUMN_1 == 8.ToString() 
select x; 
+0

這不是'x.COLUMN_1'嗎?(Linq不知道他用什麼變量創建查詢...) – 2013-01-11 19:41:19

+0

I' m只是提供實際的SQL查詢,並不完全清楚SQL服務器中的列的名稱 –

+0

FIELD是可變的,可以是COLUMN_1或COLUMN_2「或其他... stringCOLUMN是包含名稱的字符串變量 – ch2o

1

不知道什麼對象是,或者你野外採集,但首先你應該有周圍的文字引號,如果它是一個字符串比較:

from x in objets 
where x.field[stringCOLUMN_1] == "8" 
select x 

通常列名被表示爲屬性。

from x in objets 
where x.stringCOLUMN_1 == "8" 
select x 

最後,通常你有一個的DbContext,你需要鑽到它來選擇特定的表:

from x in db.TableNameHere 
where x.stringCOLUMN_1 == "8" 
select x 

沒有看到更多內容,你的代碼很難提供更多的建議。

如果你希望做一些更動態,請注意您可以附加額外的地方使用擴展方法標準:

var query = from x in db.TableNameHere select x; 
if(ShouldFilterColumn1) 
    query = query.Where(x => x.Column1 == "8"); 

var results = query.ToList(); 

沒有看到更多內容,你的代碼很難提供更多的建議。

0

您可以通過使用ExpressionTree

How to: Use Expression Trees to Build Dynamic Queries (C# and Visual Basic)

Create predicate with nested classes with Expression,其中Marc Gravell's answer看起來簡單可行做到這一點。

更新: 從上面的鏈接在LinqToSql的情況下是沒有幫助的。

看看Trisped答案(第二選項),它可能會有所幫助。

+0

我目前正在測試Marc Gravell在.net 4.0中的答案,有沒有可能它不再工作,或者他期望.net 4.5?('Where()'需要'Func <>'而不是'Expression <> '在我的系統上) – 2013-01-11 21:30:19

+0

我很抱歉,這沒有幫助。這些樣本適用於Linq To Entities。 –

0

我想你可以使用反射:

from x in db.TableName 
    where (x.GetType().GetProperty(stringCOLUMN_1_or2).GetValue(x, null)) == " 8" 
    select x; 

不知道有任何簡單的Linqish方式,雖然這樣做...

編輯:假設動態LINQ的將工作這純粹是:

from x in objets 
.Where(stringCOLUMN_1_or2 + " = ' " + 8 + "'") 
select x 

有關於動態的LINQ與SQL這裏一些更多的信息:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

它將如何在SQL腳本中進行翻譯? –

+0

@AlexanderBalte這不就是Linq to SQL引擎嗎?我想這取決於x的屬性是佔位符還是臨時對象中的數據值。 – 2013-01-11 20:24:21

+0

你不能在LinqToSql語句中反思。甚至是'String.IsNullOrEmpty'。 –

0

我能想到的三種可能性。

第一個是動態LINQ。我看了一遍,但沒有走得很遠。

第二個選項(類似於AaronLS的建議)是一次構建查詢一步。這是我最常使用的選項。
注意:您必須在select或order子句之前添加where子句,否則您將在運行時收到異常。

var query = from x in objects; 
switch (columnIndicator) 
{ 
    case ColumnIndicatorTypes.Column1: 
     query = query.Where(x => x.Column1 == "8"); 
     break; 
    case ColumnIndicatorTypes.Column2: 
     query = query.Where(x => x.Column2 == "8"); 
     break; 
    case ColumnIndicatorTypes.Column3: 
     query = query.Where(x => x.Column3 == "8"); 
     break; 
    case ColumnIndicatorTypes.Column4: 
     query = query.Where(x => x.Column4 == "8"); 
     break; 
} 

第三個選項是編碼所有選項。例如:

switch (columnIndicator) 
{ 
    case ColumnIndicatorTypes.Column1: 
     query = from x in objects 
      where x.COLUMN_1 == "8" 
      select x; 
     break; 
    case ColumnIndicatorTypes.Column2: 
     query = from x in objects 
      where x.COLUMN_2 == "8" 
      select x; 
     break; 
    case ColumnIndicatorTypes.Column3: 
     query = from x in objects 
      where x.COLUMN_3 == "8" 
      select x; 
     break; 
    case ColumnIndicatorTypes.Column4: 
     query = from x in objects 
      where x.COLUMN_4 == "8" 
      select x; 
     break; 
    default: 
     query = from x in objects 
      select x; 
     break; 
} 

如果你想看到的查詢生成我建議要麼運行查詢(像db.Log = New System.IO.StringWriter(New StringBuilder()))之前掛鉤到db.Log,你的服務器(如SQL Server事件探查器)上運行探查器,或投該對象到一個字符串(我認爲這返回查詢的字符串版本,但它已經有一段時間了)。

相關問題