【问题标题】:linq query with dynamic where clause带有动态 where 子句的 linq 查询
【发布时间】:2012-04-13 15:43:01
【问题描述】:

我需要使用 LINQ 执行类似这样的 t-sql 语句:

SELECT * FROM mytable WHERE idnumber IN('1', '2', '3')

所以在 LINQ 中我有:

Dim _Values as String = "1, 2, 3"
Dim _Query = (From m In mytable Where idnumber = _Values Select m).ToList()

不确定如何处理 _Values 以使 idnumber 评估字符串中的每个值。
提前致谢。

【问题讨论】:

标签: c# asp.net vb.net linq c#-4.0


【解决方案1】:

在这种情况下,我会选择Inner Join。如果我使用Contains,它会Iterate unnecessarily 6 次despite of the fact that there is just one match

C#版本

var desiredNames = new[] { "Pankaj", "Garg" }; 

var people = new[]  
{  
    new { FirstName="Pankaj", Surname="Garg" },  
    new { FirstName="Marc", Surname="Gravell" },  
    new { FirstName="Jeff", Surname="Atwood" }  
}; 

var records = (from p in people 
               join filtered in desiredNames on p.FirstName equals filtered  
               select p.FirstName
              ).ToList();

VB.Net 版本

Dim desiredNames = New () {"Pankaj", "Garg"}

Dim people = New () {New With { _
    .FirstName = "Pankaj", _
    .Surname = "Garg" _
}, New With { _
    .FirstName = "Marc", _
    .Surname = "Gravell" _
}, New With { _
    .FirstName = "Jeff", _
    .Surname = "Atwood" _
}}

Dim records = ( _
    Join filtered In desiredNames On p.FirstName = filtered).ToList()

包含的缺点

假设我有两个列表对象。

List 1      List 2
  1           12
  2            7
  3            8
  4           98
  5            9
  6           10
  7            6

使用 Contains,它将搜索 List-2 中的每个 List-1 项,这意味着迭代将发生 49 次!!!

【讨论】:

  • 您确定Join 不会进行所有迭代吗?它必须以某种方式自己完成。
  • 在 SQL Server 中我不会喜欢你使用Cursor
【解决方案2】:
Dim _Values as String = "1, 2, 3"
Dim _Query = (From m In mytable Where _Values.Split(", ").Contains(m.idnumber) Select m).ToList()

【讨论】:

  • _Values 需要是一个数组。
  • 对,我错过了。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多