【发布时间】:2020-05-27 11:58:14
【问题描述】:
在 EF Core 2.2 中,我拥有具有 string[] 数组属性的实体,其中在 ApplicationDbContext 中检索它们:
modelBuilder.Entity<FruitBasket>()
.Property(e => e.FruitTypes)
.HasConversion(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
例如,一个实体垫在 FruitType 列中包含一个字符串数组:{"Apple", "Banana", "Orange"} 在数据库中保存为:Apple,Banana,Orange
我试图在我的数据库中查找包含输入字符串中任何字符串的所有对象,可以说任何一个:
string[] BasketSearchedFruitTypes = new string[] { "Apple", "Grapefruit", "Pineaple" }
我的 IQueryable:
IQueryable<BasketModel> baskets = GetBasketsQueryable(); //BasketModel contains FruitType string[] prop
搜索我现在拥有的 LINQ 实体:
if (search.BasketSearchedFruitTypes != null && search.BasketSearchedFruitTypes.Length != 0)
baskets = baskets
.Where(data => search.BasketSearchedFruitTypes
.Any(x => data.FruitType
.Contains(x)));
不幸的是,它没有给我任何回报,我也没有想法了。
编辑 1: 使用表达式后:
baskets = baskets
.Where(data => search.BasketSearchedFruitTypes
.Any(x => data.FruitType
.Contains(x)));
当我尝试将其添加到列表中时,我得到了ArgumentNullException。我也不能在上面使用foreach、.Count()。和我一样:
var result = baskets.Where(data => search.BasketSearchedFruitTypes.Intersect(data.FruitType).Any();
编辑 2:
我刚刚注意到,foreach 循环通过返回的 IQueryable,但在某些时候会中断给ArgumentNullException。即使循环内部的try catch 也无济于事......
编辑 3:
实际上,当我将返回的 IQueryable 的 foreach 放入 try catch 时,这是一种临时解决方案,并且效果很好。但我仍然不明白为什么它在枚举时崩溃(循环,而不是循环内的代码)。
【问题讨论】:
-
你可以试试这种方式
var result = baskets.Where(data => search.BasketSearchedFruitTypes.Any(x => x.Contains(data.FruitType))); -
@Phong
data.DetailedType给了我一个例外,无法将string[]转换为char -
你可以使用
Intersect来实现它var result = baskets.Where(data => search.BasketSearchedFruitTypes.Intersect(data.FruitType).Any(); -
@Phong 它仍然没有给我任何结果
-
如果你去掉
Where子句,你会得到什么结果?
标签: c# arrays linq iqueryable ef-core-2.2