【问题标题】:Sql query with multiple ids in .NET.NET 中具有多个 id 的 Sql 查询
【发布时间】:2018-09-07 17:54:22
【问题描述】:

我有以下方法

public SomeObj LoadSomeData(int id)
{
    using (var context = new DataContext())
    {
        var result = 
            context.Database.SqlQuery<SomeObj>
            ($"SELECT * FROM SOMEOBJECT WHERE id = {id}")
        return result;
    }
}

这很好,现在规范已经改变,我需要查找多个ids。我将 id 作为 int 列表获取并返回一个列表。我读了一些关于 Sql Query 的内容,我可以使用 IN 并传递多个值。所以这是我的改变:

public List<SomeObj> LoadSomeData(List<int> listOfIds)
{
    using (var context = new DataContext())
    {
        var result = 
            context.Database.SqlQuery<SomeObj>
            ($"SELECT * FROM SOMEOBJECT WHERE id IN ({id})") <-- I am not sure how to pass list in 
        return result;
    }
}

当我手动将值传递给 1、2、3 等查询时,第二种方法有效,但是如何将列表传递给查询?

【问题讨论】:

  • 你是什么意思多个id,而不是返回一个特定的id,你想用这些id抓取一批记录?
  • ($"SELECT * FROM SOMEOBJECT WHERE id IN (1,2,3,4)")

标签: c# .net


【解决方案1】:

这可以通过不同的方式实现。我建议一种方法是使用Join 方法。

var ids = string.Join(",", listOfIds)

这会将{1, 2, 3} 的列表返回到1, 2, 3 的字符串

所以把它和你的最终方法放在一起看起来像这样:

public List<SomeObj> LoadSomeData(List<int> listOfIds)
{
    var ids = string.Join(",", listOfIds)
    using (var context = new KmdDataContext())
    {
        var result = 
            context.Database.SqlQuery<SomeObj>
            ($"SELECT * FROM SOMEOBJECT WHERE id IN ({Ids})")
        return result;
    }
}

【讨论】:

  • 谢谢你解决了这个问题,我不能投票,但会接受这个
【解决方案2】:

您可以通过生成列表来传递它们:

var idList = string.Join(",", listOfIds);
$"SELECT * FROM SOMEOBJECT WHERE id IN ({idList})")

但是如果列表变大(从内存中,超过 2000 个左右),那将会失败。如果您需要更多,请使用Table-Valued Parameter - 设置起来会更费力,但它们非常简洁且可扩展。

【讨论】:

    【解决方案3】:

    尝试String.Join(",", listofids) 将列表转换为逗号分隔的字符串,您可以在 sql 查询的 In 部分使用该字符串

    【讨论】:

    • 我想我有点慢,伙计们的回答和我一样。为他们 +1
    • 从 .Net 4 开始,您不必使用 ToArray() 创建数组,因为您可以传递 IEnumerable&lt;string&gt;
    • Ahmad listofids 已经是一个列表,为什么要将其转换为数组?而join是大写的Join。但否则你也会得到我的投票。
    【解决方案4】:

    如果你已经有一个收藏,你可以这样做。

    var ids = String.Join(",", parameters.Where(value => value > 5 && value < 10));
    

    现在您可以将变量传递给查询。

    var query = $"SELECT * FROM ... WHERE Id IN ({ids})";
    

    【讨论】:

    • .. 值 5 和 10 是从哪里来的?
    • @stuartd 只是将它用作基本的 where 子句来过滤集合以放置范围。假设列表中的内容超出了他实际想要查询的内容。
    【解决方案5】:

    这是一种使用LINQEntity Framework 的方法。从您的示例来看,没有明显需要使用原始SQL

    public List<SomeObj> LoadSomeData(List<int> listOfIds)
    {
        using (var context = new DataContext())
        {
            return context.SomeObj.Where(x => listOfIds.Contains(x.id)).ToList();
        }
    }
    

    这相当于WHERE id in (1,2,3)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多