Предложения LINQ Chaining Where

#entity-framework-4 #linq-to-entities #entity

#entity-framework-4 #linq-to-entities #сущность

Вопрос:

Я пытаюсь написать динамический поиск I и цепочку предложений where, ниже приведены мои классы и пример кода.

 public class Person
{
    public int PersonId { get; set; }
    //More Fields ..
}

//Link Table
public class PersonAddress
{
    public int PersonID { get; set; }
    public int AddressID { get; set; }
    //More Fields ..
}

public class Address
{
    public int AddressId { get; set; }
    public int ReferenceDataID { get; set; }
    //More Fields ..
}

public class ReferenceData
{
    public int ReferenceDataId { get; set; }
    public string MyData { get; set; }
    //More Fields ..
}


var query = (from p in People.Include("PersonAddresses")
 .Include("PersonAddresses.Address")
 .Include("PersonAddresses.Address.ReferenceData")
             select p);


if (!String.IsNullOrEmpty(searchName))
      query = query.Where(q => q.Search.Contains(person.SearchName));

// How can I access the MyData
if (!String.IsNullOrEmpty(searchCountry))
                query = query.Where(q => q.Search.Where(a => a. == "Ireland");
  

Спасибо.

Комментарии:

1. Всегда пожалуйста. В чем вопрос? То, что вы делаете, совершенно справедливо, если это то, о чем вы спрашиваете. Поскольку запрос фактически не выполняется до тех пор, пока вы не используете результаты (например, выполните итерацию по запросу и распечатаете все его элементы), вы можете связать столько Where элементов, сколько захотите.

2. Приветствую. Последняя строка — это то, куда я падаю. Я пытаюсь связать несколько предложений where, чтобы я мог получить доступ к ссылочным данным через адрес через PersonAddress через Person. Итак, я могу указать страну.

Ответ №1:

Если вы хотите отфильтровать связанные записи, это невозможно при использовании includes. Включение позволяет загружать только все свойства. Единственный возможный способ получить отфильтрованные свойства навигации в одном запросе — это ручной запрос с проецированием на не-объект или анонимный тип:

 var query = from p in context.Persons
            select new 
            {
                Person = p,
                Addresses = p.PersonAddreeses
                             .Where(pa => pa.Address.Country == "Ireland")
            };
  

Если вы хотите получить person, который содержит адрес из Ирландии, без фильтрации загруженных адресов, вы не можете использовать определенный вами запрос. Где ожидает выражение, приводящее к bool , а не к другому запросу. Попробуйте это:

 query = query.Where(p => p.PersonAddresses
                          .Any(pa => pa.Address.Country == "Ireland");
  

Я абсолютно не уверен, что есть Search в вашем примере.