Как выполнить поиск с помощью объектов LINQ, имеющих свойства массива string [], и найти их, содержащие любую строку из массива string []? - PullRequest
0 голосов
/ 12 февраля 2020

В EF Core 2.2 у меня есть объекты со свойствами массива string[], где в ApplicationDbContext они получаются с:

modelBuilder.Entity<FruitBasket>()
            .Property(e => e.FruitTypes)
            .HasConversion(
                v => string.Join(',', v),
                v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));

Например, циновка объекта содержится в столбце FruitType массив strning: {"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();

EDIT 2: Я только что заметил, что foreach l oop проходит через возвращенный IQueryable, но в какой-то момент перерывы дают ArgumentNullException. Даже try catch внутри l oop не помогает ...

РЕДАКТИРОВАТЬ 3: На самом деле, когда я помещаю foreach возвращенного IQueryable в try catch, это временного решения, и он работает нормально. Но все же я не понимаю, почему происходит сбой при перечислении (цикл, а не код внутри l oop).

1 Ответ

0 голосов
/ 12 февраля 2020

Если я составлю список, аналогичный вашему протоколу БД, чем у меня работают эти коды.

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; }
    }
}
...