【问题标题】:LINQ query with a where condition containing带有 where 条件的 LINQ 查询
【发布时间】:2015-01-03 22:51:37
【问题描述】:

我刚刚学习 LINQ,遇到了问题,我不确定如何在 LINQ 中做。

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

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

提前致谢


我查看了 Tim 和 James 的答案,还查看了 James 发送的线路。我还是有点困惑......对不起。下面是我的实际代码。它编译但不起作用

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

【问题讨论】:

  • ToString() 不受 Linq-To-Entities 支持。而是将字符串列表转换为整数列表并使用Contains

标签: c# linq contains


【解决方案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;

number 列是intList&lt;string&gt; 存储字符串,可能您的LINQ 提供程序不支持.Contains(figure.ToString())。然后先把字符串转成int:

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

【讨论】:

  • 嗨蒂姆,谢谢你,我将如何在下面的 LINQ 语句中使用它。
  • var salesQuery = (from d in db.Figures where (d.information == "SALES") && (WHERE d.number is in the list "1,3,4,5") 选择{....}
  • @TimSchmelter:可能还会在 linq 上添加额外的约束。
  • @TimSchmelter 刚刚在我编辑问题时看到了您的答案。生病试一试。谢谢
  • 其中 d.TypeOfinformation == "DEPTSALES" && d.OutletNo.Contains(outletsNeeded) 给我以下错误> 错误 1 ​​实例参数:无法从 'int' 转换为 'System.Linq.IQueryable 'AND 错误 2'int' 不包含 'Contains' 的定义和最佳扩展方法重载 'System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource) ' 有一些无效的参数
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    据我了解,您希望以与 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 
    

    干杯
    马切耶

    【讨论】:

      【解决方案4】:

      谢谢大家 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
                          };
      

      再次感谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多