【问题标题】:How to realize tsql "IN" equivalent using dynamic Linq如何使用动态 Linq 实现 tsql“IN”等价物
【发布时间】:2011-10-13 12:21:15
【问题描述】:

我正在创建一个可以接收任何 Linq 查询的通用表单 (C#)。在这种形式中,我希望能够添加过滤器(WHERE 子句)。对于'='、'>'、'Like'等运算符,我可以执行IQueryable.Where(someFieldname + "> @0", someCriteria) 之类的操作。但是当我想能够做相当于 T-sql "IN" 的时候,我完全迷失了。我已经搜索了几个小时,但找不到实现它的方法。

当考虑它时,应该可以将 IN 子句的值放入字符串数组或其他一些简单的字符串列表中。然后将此列表与基本查询连接起来。但是当基本查询可以是任何查询时,我怎样才能加入这两个呢?

示例: 假设我的基本查询类似于:

IQueryable<Object> q = from a in db.Adresses
                       select new { a.Street, a.HouseNr };

在我希望能够像这样过滤 HouseNr 的形式: Where HouseNr IN (1, 3, 5) 数字 (1, 3, 5) 在字符串数组(或任何其他字符串列表)中可用。

知道基本查询可以是任何东西,我该如何实现这一点?

【问题讨论】:

  • 我认为没有一个人能理解您的问题。您可以使用 Dynamic Linq 生成OR 语句的列表,尽管这与IN 子句完全相同

标签: c# linq linq-to-sql dynamic


【解决方案1】:
int[] list = new[]{1, 3, 5};
IQueryable<Object> q = from a in db.Adresses
                       where list.Contains(a.HouseNr)
                       select new { a.Street, a.HouseNr };

【讨论】:

  • 当你有一个名为 Adresses 的对象时,这确实有效,但我所拥有的是一个可以是任何东西的查询。我需要一个动态解决方案,而不是我硬编码引用 Linq 对象的解决方案。
  • @Stefan 你仍然可以以同样的方式在动态查询结果上使用 Contains()。
  • 你能举个例子吗?我似乎无法正确弄清楚。
  • 你能举个例子吗?谢谢你的时间。
【解决方案2】:

在生成 SQL 时,Contains 映射到 IN

int[] numbers = new int[] { 1, 3, 5 };

var q = from a in db.Addresses
        where numbers.Contains(a.HouseNr)
        select new { a.Street, a.HouseNr }

【讨论】:

  • 不幸的是,这不是我的问题的解决方案。我以地址为例。用任何 IQueryable 对象替换 Adresses:您的解决方案是什么?
【解决方案3】:

这样怎么样……

string[] Numbers = new string[]{"1", "3", "5"};
IQueryable<Object> q = db.Adresses.Where(a => Numbers.Contains(h.HouseNr));

【讨论】:

    【解决方案4】:

    只是一个想法....Intersect() 方法不是返回一个列表的值,其中两个值都存在吗?

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多