Фильтровать список объектов сущностей по строковому свойству дочернего объекта, используя Linq Lambda - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь вернуть земли IQueryable, отфильтрованные по свойству дочернего объекта Owner.Name.Хорошо работает с решением стилей запросов, но я хочу использовать лямбда-решение.

Вкратце это мои классы, сопоставленные EntityFramework:

public class Land
{
     public int Id { get; set; }

     public virtual ICollection<Owner> Owners { get; set; }
}

public class Owner
{
        public int Id { get; set; }
        public string Name { get; set; }
        public int LandId { get; set; }

        public virtual Land Lands { get; set; }
}

Запрос, который работает нормально:

 var list = from land in db.Lands
                   join owner in db.Owners on land.Id equals Owner.LandId
                   where owner.Name.Contains("Smit")
                   select land;

Я пытался использовать это:

var list = db.Lands.Where(lnd => lnd.Owners.Count() > 0 &&
             lnd.Owners.Where(own => own.Name.Contains("Smit")).Count() > 0);

Это работает только для небольших списков, но для некоторых с тысячами записей это дает время ожидания.

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

Хорошо, одна проблема, которая может вызывать проблему скорости, состоит в том, что ваша лямбда-версия и не лямбда-версии делают очень разные вещи.Вы не лямбда - это соединение, где с одной стороны от соединения.

Почему бы просто не написать лямбда-эквивалент этого?

var list = db.Lands.Join(db.Owners.Where(x=> x.Name.Contains("Smit")), a=> a.Id, b => b.LandId, (a,b) => a).toList();

Я имею в виду, что этоболее прямой эквивалент вашего не лямбда

0 голосов
/ 15 мая 2019

Попробуйте что-нибудь более простое:

var lands = db.Owners.Where(o => o.Name.Contains("Smit")).Select(o => o.Lands);

Вам просто нужно убедиться, что Owner.Name не равно NULL, а LINQ сделает все остальное.

0 голосов
/ 15 мая 2019

Я думаю, вы можете использовать это:

var list = db.Lands.Where(lnd => lnd.Owners.Any(x => x.Name.Contains("Smit")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...