LINQ查询带有where条件

时间:2015-01-03 22:51:38

标签: c# linq contains

我只是在学习LINQ,而且我遇到了问题我不知道如何在LINQ中做。

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

我的数据库中有一个包含数字的字段。我只想选择数据库中的数字在数字的行列表中的行#34; 1,3,4,5&#34; (这些数字只是例子)。

提前致谢


我看过蒂姆和詹姆斯的回答,还看了詹姆斯派出的那条线。我还是有点困惑.....抱歉。以下是我的实际代码。它编译但不起作用

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,因此应该有两条记录。 对不起,如果这是一个简单的事情,它对我来说是新的,令人沮丧。

4 个答案:

答案 0 :(得分:1)

您可以将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;

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

据我了解,您希望以与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 +任何编程语言都更灵活。您可以构建一个整数列表(列表)来构建查询。

见简单示例:

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 

干杯
马切伊

答案 3 :(得分:0)

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

有效的最终代码如下

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
                    };

再次感谢。