比较连接表中的字符串列和LINQ / entity框架中的可选字符串数组

本文关键字:字符串 框架 entity 数组 连接 比较 LINQ | 更新日期: 2023-09-27 17:52:43

我有一个。net 4.6 webAPI,我试图传递一个可选参数,这将是一个名为位置的字符串数组。

我想确定我是否传递了这个参数,然后如果我确实有一个位置数组,我想确定从一个连接表/模型的列是否等于位置数组中的任何字符串。

我使用if else在两个查询之间切换,我正在比较似乎足够的位置。

我的问题是我不知道如何迭代位置数组中的所有元素,并将其与整个数组进行比较,而不是一行中的一个元素dealer.Location.Contains (x)) 。我可以将其与单个元素X进行比较,但我不能正确地执行此策略,将其一次性与字符串数组进行比较,而不是将其与本文中概述的单个字符串进行比较(不接受投票最多的答案是我试图尝试的失败)。[此链接]]我将我的where行更改为locations.Any(dealers.LocationName.Contains))我在尝试时得到的错误是

{"内部。net框架数据提供程序错误1025。"}

更新:我认为我可能需要在我的where子句中的位置之后抛出一个AsQueryable,但这似乎并没有解决它

 public IHttpActionResult getAllCars([FromUri] string[] locations=null)
    {
        string y = "foo";
        string x = locations[0] ?? y;
        using (dbContext db = new dbContext())
        {
            if (locations == null)
            {
               var query = (from results in db.Cars
                             join dealers in db.Dealers on results.DealerID equals dealer.DealerNumber
                             select new
                             {
                                 ID = results.VinNumber,
                                 make = results.Make,
                                 model = results.Model,
                                 Dealer = dealers.DealerName
                             });
                return Ok(query.ToList());
            }
            else
            {
                var query = (from results in db.Cars
                             join dealers in db.Dealers on results.DealerID equals dealer.DealerNumber
                            where (dealer.LocationName.Contains(x))
                             select new
                             {
                                 ID = results.VinNumber,
                                 make = results.Make,
                                 model = results.Model,
                                 Dealer = dealers.DealerName
                             });
                return Ok(query.ToList());
            }
        }
    }

比较连接表中的字符串列和LINQ / entity框架中的可选字符串数组

如果我确实有一个位置数组,我想确定从一个连接表/模型中的列是否等于任何的位置数组中的字符串。

您可以使用locations Contains方法。

也可以通过将dealers放入变量来简化查询,可选地应用过滤器,然后在查询中使用它,如下所示:

using (dbContext db = new dbContext())
{
    var dealers = db.Dealers.AsQueryable();
    if (locations != null)
        dealers = dealers.Where(dealer => locations.Contains(dealer.LocationName));
    var query = (from car in db.Cars
                 join dealer in dealers on car.DealerID equals dealer.DealerNumber
                 select new
                 {
                     ID = car.VinNumber,
                     make = car.Make,
                     model = car.Model,
                     Dealer = dealer.DealerName
                  });
    return Ok(query.ToList());
}

注:如果您确实需要像原始代码中那样的部分匹配,那么您可以使用Any方法代替:

    if (locations != null)
        dealers = dealers.Where(dealer => locations.Any(location => dealer.LocationName.Contains(location)));