如何使用具有 string[] 数组属性的 LINQ 实体进行搜索并找到包含 string[] 数组中的任何字符串的实体?
How to search with LINQ entites having string[] array properties and find these containing any of string from string[] array?
对于 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)));
不幸的是 returns 我什么都没有,我 运行 没主意了。
编辑 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
时,它是一种临时解决方案并且工作正常。但我仍然不明白为什么它在枚举时崩溃(循环,而不是循环内的代码)。
如果我在您的 DB 协议中列出了类似的列表,那么这个代码对我有用。
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class BuilderClass
{
List<BasketModel> baskets;
public BuilderClass()
{
baskets = new List<BasketModel>()
{ new BasketModel { FruitType = new string[] { "Apple", "Grapefruit", "Pineaple", "Bing Cherry", "Cantaloupe" } },
new BasketModel { FruitType = new string[] { "Grapefruit", "Cantaloupe", "Pineaple", "Boysenberries", "Apple" } },
new BasketModel { FruitType = new string[] { "Clementine", "Bing Cherry", "Boysenberries", "Cantaloupe", "Entawak" } },
new BasketModel { FruitType = new string[] { "Entawak", "Grapefruit", "Apple", "Pineaple", "Cantaloupe" } },
new BasketModel { FruitType = new string[] { "Apple", "Pineaple", "Bing Cherry", "Entawak", "Grapefruit" } }
};
}
string[] BasketSearchedFruitTypes = new string[]
{ "Apple", "Grapefruit", "Pineaple" };
public void check()
{
var qbaskets = baskets.AsQueryable();
if (BasketSearchedFruitTypes != null && BasketSearchedFruitTypes.Length != 0)
{
var result = qbaskets.Where(data => BasketSearchedFruitTypes.Any(x => data.FruitType.Contains(x))).ToList();
// result have list with count of 4
}
}
}
class BasketModel
{
public string[] FruitType { get; set; }
}
}
对于 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)));
不幸的是 returns 我什么都没有,我 运行 没主意了。
编辑 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
时,它是一种临时解决方案并且工作正常。但我仍然不明白为什么它在枚举时崩溃(循环,而不是循环内的代码)。
如果我在您的 DB 协议中列出了类似的列表,那么这个代码对我有用。
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class BuilderClass
{
List<BasketModel> baskets;
public BuilderClass()
{
baskets = new List<BasketModel>()
{ new BasketModel { FruitType = new string[] { "Apple", "Grapefruit", "Pineaple", "Bing Cherry", "Cantaloupe" } },
new BasketModel { FruitType = new string[] { "Grapefruit", "Cantaloupe", "Pineaple", "Boysenberries", "Apple" } },
new BasketModel { FruitType = new string[] { "Clementine", "Bing Cherry", "Boysenberries", "Cantaloupe", "Entawak" } },
new BasketModel { FruitType = new string[] { "Entawak", "Grapefruit", "Apple", "Pineaple", "Cantaloupe" } },
new BasketModel { FruitType = new string[] { "Apple", "Pineaple", "Bing Cherry", "Entawak", "Grapefruit" } }
};
}
string[] BasketSearchedFruitTypes = new string[]
{ "Apple", "Grapefruit", "Pineaple" };
public void check()
{
var qbaskets = baskets.AsQueryable();
if (BasketSearchedFruitTypes != null && BasketSearchedFruitTypes.Length != 0)
{
var result = qbaskets.Where(data => BasketSearchedFruitTypes.Any(x => data.FruitType.Contains(x))).ToList();
// result have list with count of 4
}
}
}
class BasketModel
{
public string[] FruitType { get; set; }
}
}