【问题标题】:How to use "in" where clause in LINQ where the string set will be supplied by a list?如何在 LINQ 中使用“in”where 子句,其中字符串集将由列表提供?
【发布时间】:2014-07-08 14:41:43
【问题描述】:

我需要使用 LINQ 搜索数据源。

本质上,我想要的查询类似于:

select * from table where id in ("1","2","4");

增加的“复杂性”是括号内的值将来自字符串列表。

这是我的代码:

    public void getAdUserData(List<String> _inADUserDatas)
    {
        var records = from _adUserDatas in _adUserDataDBDataContex.ADUserDatas
            where
                new string[] { (char)34 + String.Join((char)34 + "," + (char)34, _inADUserDatas) + (char)34 }.Contains(_adUserDatas.fan)
            orderby _adUserDatas.fan
            select _adUserDatas;

        var test = records.ToList();
        Console.WriteLine((char)34 + String.Join((char)34 + "," + (char)34, _inADUserDatas) + (char)34);

可以看出,我使用 String.join 将列表转换为逗号分隔的字符串,其中每个字符串都用双引号括起来。

我也尝试过使用下面的代码,但没有任何运气。

  new string[] {String.Join(",", _inADUserDatas) }.Contains(_adUserDatas.fan)

我还尝试将列表中的一些 ID 手动输入到查询中,我正在获取记录。

我相信我做得对,但它没有返回任何记录。变量 test 的计数为 0。

有什么想法可能是错的吗?通过结合 stackoverflow 中的几个讨论,特别是 this link herethis other link,我已经得到了我的代码的想法。

非常感谢

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    在列表本身上致电Contains。查询提供者应该开箱即用地处理它:

    var records = from _adUserDatas in _adUserDataDBDataContex.ADUserDatas
                  where _inADUserDatas.Contains(_adUserDatas.fan)
                  orderby _adUserDatas.fan
                  select _adUserDatas;
    

    【讨论】:

    • 谢谢。有用。我会把答案告诉另一个人,因为我的屏幕显示他先回答了。但是非常感谢您的帮助:)
    • @mrjayviper 实际上 Marcin 快了 8 秒 =)
    • @mrjayviper 很高兴能帮助您解决问题。而且我真的不在乎您是否要将我的答案标记为已接受。这只是点;)
    【解决方案2】:

    只需在您的收藏中使用 contains:

    var records = from _adUserDatas in _adUserDataDBDataContex.ADUserDatas
                  where _inADUserDatas.Contains(_adUserDatas.fan)
                  orderby _adUserDatas.fan
                  select _adUserDatas;
    

    【讨论】:

    • 它有效。谢谢。附言。我对 c# 很陌生,所以我还是个婴儿 :)
    【解决方案3】:

    你可以使用下面提到的代码

    var list=_adUserDataDBDataContex.ADUserDatas.Where(p=>p.Contains(_adUserDatas.fan));
    

    【讨论】:

    • 虽然这可以回答这个问题,但它没有解释为什么?请解释为什么这是有效的,也许为什么它是最好的方法。如果问题作者新做你建议的事情,他们显然已经这样做了,所以向他们解释一下。
    【解决方案4】:

    ids的数据类型是什么?

    一个简单的 collection.Where(s=> ids.Contains(s)) 将转换为“in” 我不确定 linq to SQL 如何翻译这些类型的查询,但您不需要在 EF 中使用逗号连接,无需手动尝试创建逗号分隔列表即可尝试。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 2021-07-09
      • 2021-12-29
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多