#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
в вашем примере.