Сборка помощника C # Linq - PullRequest
       18

Сборка помощника C # Linq

1 голос
/ 16 августа 2010

Я пытаюсь создать служебный метод с использованием Linq, который поможет мне с обычным поиском Linq-to-Objects.

У меня есть объект PropertyTbl, который имеет ссылку на адрес. У меня есть IEnumerable<PropertyTbl>. Я написал помощник, который принимает IEnumerable<Address>, а некоторые критерии поиска возвращают IEnumerable<Address>, который при повторении даст мне совпадающие адреса.

Однако я не могу понять, как соединить их вместе, потому что хотя я могу сделать .Select () на моем IEnumerable<PropertyTbl>, чтобы получить перечислимый адрес, мне нужен результат, равный IEnumerable<PropertyTbl>.

Вот мой вспомогательный код

    public static IEnumerable<Address> BuildAddressWhereClause(IEnumerable<Address> addresses, string value, AddressSearchOptions options)
    {
        string search = value.ToUpper();

        if ((options & AddressSearchOptions.Address1To4) == AddressSearchOptions.Address1To4)
        {
            addresses = addresses.Where(o => o.Address1.ToUpper().Contains(search)
                                             || o.Address2.ToUpper().Contains(search)
                                             || o.Address3.ToUpper().Contains(search)
                                             || o.Address4.ToUpper().Contains(search));
        }

        if ((options & AddressSearchOptions.City) == AddressSearchOptions.City)
        {
            addresses = addresses.Where(o => o.City.ToUpper().Contains(search));
        }

        if ((options & AddressSearchOptions.PostCode) == AddressSearchOptions.PostCode)
        {
            addresses = addresses.Where(o => o.PostCode.ToUpper().Contains(search));
        }

        return addresses;
    }

и я хочу вот что.

IEnumerable<PropertyTbl> properties = ...;

IEnumerable<PropertyTbl> filteredProperties = <use my address helper somehow>;

// this works but I need the properties as the result not just the addresses
IEnumerable<Address> filteredAddresses = AddressUtils.FilterAddresses(properties.Select(o => o.Address), "1 High Street", ...);

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

Любые предложения приветствуются.

1 Ответ

2 голосов
/ 16 августа 2010

IEnumerable<PropertyTbl> не является IEnumerable<Address>, поэтому вам нужно каким-то образом добраться до поля Address поля PropertyTable (если только вы не изменили BuildAddressWhereClause на значение IEnumerable<PropertyTbl>.

Что-то вроде этого должно сработать:

public static IEnumerable<T> BuildAddressWhereClause<T>(IEnumerable<T> source, string value, AddressSearchOptions options, Func<T, Address> addressExtractor) { 
    string search = value.ToUpper(); 

    if ((options & AddressSearchOptions.Address1To4) == AddressSearchOptions.Address1To4) { 
        source = source.Where(o => addressExtractor(o).Address1.ToUpper().Contains(search) 
                                   || addressExtractor(o).Address2.ToUpper().Contains(search) 
                                   || addressExtractor(o).Address3.ToUpper().Contains(search) 
                                   || addressExtractor(o).Address4.ToUpper().Contains(search)); 
    } 

    if ((options & AddressSearchOptions.City) == AddressSearchOptions.City) { 
        source = source.Where(o => addressExtractor(o).City.ToUpper().Contains(search)); 
    } 

    if ((options & AddressSearchOptions.PostCode) == AddressSearchOptions.PostCode) { 
        source = source.Where(o => addressExtractor(o).PostCode.ToUpper().Contains(search)); 
    } 

    return source; 
} 

А потом вы вызываете это как

IEnumerable<PropertyTbl> properties = ...;      
IEnumerable<PropertyTbl> filteredProperties = AddressUtils.FilterAddresses(properties, "whatever", AddressSearchOptions.Whatever, p => p.Address);
...