比较连接表中的字符串列和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());
}
}
}
如果我确实有一个位置数组,我想确定从一个连接表/模型中的列是否等于到任何的位置数组中的字符串。
您可以使用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)));