LINQ Chaining Где пункты - PullRequest
       32

LINQ Chaining Где пункты

0 голосов
/ 29 апреля 2011

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

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 Ответ

1 голос
/ 30 апреля 2011

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

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

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

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

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

...