包含 where 条件的 LINQ 查询

本文关键字:LINQ 查询 条件 where 包含 | 更新日期: 2023-09-27 18:36:09

我只是在学习 LINQ,我遇到了我不确定如何在 LINQ 中做什么的问题。

string numbers = "1,3,4,5";
string[] outletsInaStringArray = outlets.Split(',');
List<string> numbersAsAList = outletsInaStringArray.ToList();

我的数据库中有一个字段,其中包含一个数字。我只想选择数据库中数字所在的行 在数字"1,3,4,5"的行列表中(这些数字只是示例)。

提前致谢


我看了

蒂姆和詹姆斯的回答,也看了詹姆斯发来的那条线。 我还是有点困惑.....不好意思。下面是我的实际代码。它编译但不工作

string outlets = "1,3,4,5"
string[] outletsNeeded = outlets.Split(',');
List<string> outletsNeededList = outletsNeeded.ToList();
DashboardEntities1 db = new DashboardEntities1();
var deptSalesQuery =  (
from d in db.DashboardFigures
where (d.TypeOfinformation == "DEPTSALES") && (outletsNeeded.ToString().Contains(d.OutletNo.ToString())) 
                                     select new DeptSales
                                     {
                                          Dn = (int)d.Number,
                                          Dnm = "Mens",
                                          On  = d.OutletNo,
                                          Qs = (double)d.Value_4,
                                          Se = (double)d.Value_2,
                                          Si = (double)d.Value_3
                                     }                                    
                                 );

在SQL的DASHBAORDFIGURES表中,我有2条记录,其中网点编号= 1,因此应该有两条记录。对不起,如果这是一件简单的事情,它对我来说只是新的,而且令人沮丧。

包含 where 条件的 LINQ 查询

您可以使用

Contains作为标记:

var query = db.Table
    .Where(x => outletsInaStringArray.Contains(x.Number) && x.information == "SALES");

这是方法语法,如果您更喜欢查询语法:

var query = from figure in db.Figures
            where outletsInaStringArray.Contains(figure.number)
              &&  figure.information == "SALES"
            select figure;

但是列numberint的,List<string>存储字符串,也许你的LINQ提供程序不支持.Contains(figure.ToString())。然后首先将字符串转换为 int:

List<int> outletsNeededList = outletsNeeded.Select(int.Parse).ToList();

Tim 提供的答案是一种方法。Linq 和 lambda 是可以互换的。也看看下面的帖子。链接

var result = from x in db.Table.ToList()
             where outletsInaStringArray.Contains(x.Number)
             select x;

另请查看以下内容,因为它提供了与您正在寻找的解决方案非常相似的解决方案:链接

据我了解,您希望以与 IN (SQL) 子句类似的方式获取数据。

SELECT <Field_List>
FROM Table
WHERE IntegerField IN (1,2,4,5)

但我想知道你为什么要这样做,当你可以连接数据并只获得匹配时。更糟糕的是,您正在尝试混合不同的数据类型并将逗号分隔的文本作为一组整数传递(我可能是错的):

SELECT <Field_List>
FROM Table
WHERE IntegerField IN ("1,2,4,5")

上面的查询不会执行,因为整数集被"打包"成逗号分隔的字符串。为了能够执行该查询,必须在数据类型之间进行转换。字符串中的数字必须转换为一组整数(使用用户定义的拆分函数或公用表表达式):

;WITH CTE AS
(
     --here convertion occurs
)
SELECT t2.<Field_List>
FROM CTE As t1 INNER JOIN TableName AS t2 ON t1.MyNumber = t2.IntegerField 

Linq + 任何编程语言都更加灵活。您可以构建整数列表 (List) 来构建查询。

请参阅简单示例:

void Main()
{
    List<MyData> data = new List<MyData>{
                    new MyData(1,10),
                    new MyData(2, 11),
                    new MyData(5, 12),
                    new MyData(8, 13),
                    new MyData(12, 14)
                    };
    //you're using comma delimited string 
    //string searchedNumbers = "1,3,4,5";
    //var qry = from n in data 
    //      join s in searchedNumbers.Split(',').Select(x=>int.Parse(x)) on n.ID equals s 
    //      select n;
    //qry.Dump();
    List<int> searchedNumbers = new List<int>{1,2,4,5};
    var qry = from n in data 
            join s in searchedNumbers on n.ID equals s 
            select n;
    qry.Dump();
}
// Define other methods and classes here
class MyData
{
    private int id = 0;
    private int weight = 0;
    public MyData(int _id, int _weight)
    {
        id = _id;
        weight = _weight;
    }
    public int ID
    {
        get{return id;}
        set {id = value;}
    }
    public int Weight
    {
        get{return weight;}
        set {weight = value;}
    }
}

结果:

ID  Weight
1   10 
5   12 

干杯
马切伊

谢谢大家,iv现在使用您的所有建议让它工作

最终有效的代码如下

DeptSales myDeptSales = new DeptSales();                  // Single department
List<DeptSales> myDeptSalesList = new List<DeptSales>();  // List of Departments
DashboardEntities1 db = new DashboardEntities1();
var deptSalesQuery = from d in db.DashboardFigures
join s in outlets.Split(',').Select(x => int.Parse(x)) on d.OutletNo equals s
where (d.TypeOfinformation == "DEPTSALES")
select new DeptSales
                   {
                    Dn = (int)d.Number,
                    Dnm = "Mens",
                    On = d.OutletNo,
                    Qs = (double)d.Value_4,
                    Se = (double)d.Value_2,
                    Si = (double)d.Value_3
                    };

再次感谢。