Entity Framework несколько, где условия, ищет правильность или лучший путь - PullRequest
1 голос
/ 11 января 2011

Я пытаюсь загрузить объекты клиента из моей базы данных, где имя клиента может содержать определенную строку, а также любые связанные адреса, имеющие конкретные значения в определенных полях.Я провел немало исследований и т. Д., Чтобы собрать это воедино.Является ли это правильным способом построения такого запроса, а если нет, то какой подход более правильный или более эффективный?Спасибо за ваше время.

У меня есть LINQPad, и этот запрос был обработан с его использованием.


var customerName = "J";
var street = "Rd";
var city = "asdf";
var state = "TN";
var zip = "27613";

var query = (
    from c in customers
        .Include("locations")
        .Include("locations.address")
    where
        c.name.Contains(customerName) ||
        c.locations.Any(l => l.address.street1.Contains(street)) ||
        c.locations.Any(l => l.address.street2.Contains(street)) ||
        c.locations.Any(l => l.address.city.Contains(city)) ||
        c.locations.Any(l => l.address.state.Contains(state)) ||
        c.locations.Any(l => l.address.zip.Contains(zip))
    select new
    {
        c.id,
        c.name,
        c.locationId,
        c.location,
        Locations = 
            from l in c.locations 
            where 
                l.address.street1.Contains(street) || 
                l.address.street2.Contains(street) || 
                l.address.city.Contains(city) ||
                l.address.state.Contains(state) ||
                l.address.zip.Contains(zip)
            select new
            {
                l.id,
                l.address,
                l.description,
                l.locationType
            }
    }
);

query.Dump();

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

Я уверен, что это довольно типичный шаблон поиска с использованием Entity Framework.

1 Ответ

1 голос
/ 12 января 2011

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

var query = 
    from l in c.locations
    where 
        l.customer.name.Contains(customerName) ||
        l.address.street1.Contains(street) || 
        l.address.street2.Contains(street) || 
        l.address.city.Contains(city) ||
        l.address.state.Contains(state) ||
        l.address.zip.Contains(zip)
    group l by l.customer into g
    select new
    {
        id = g.Key.id,
        name = g.Key.name,
        // etc.
        Locations = from l2 in g
                    select new
                    {
                        l2.id,
                        l2.address,
                        l2.description,
                        l2.locationType
                    }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...