2013-01-11 47 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事件探查器)上运行探查器,或投该对象到一个字符串(我认为这返回查询的字符串版本,但它已经有一段时间了)。

相关问题