Entity Framework запрос - PullRequest
       13

Entity Framework запрос

0 голосов
/ 23 апреля 2010

У меня есть фрагмент кода, который я не знаю, как его улучшить.

У меня есть две сущности: EntityP и EntityC. EntityP является родителем EntityC. Это отношения 1 ко многим. EntityP имеет свойство, зависящее от свойства всех подключенных EntityC.

Мне нужно загрузить список EntityP с правильно установленным свойством. Поэтому я написал фрагмент кода, чтобы сначала получить список EntityP. Он называется entityP_List. Затем, как я писал ниже, я перебираю entityP_List и для каждого из них запрашиваю базу данных с помощью функции «any», которая в конечном итоге будет преобразована в SQL-запрос «NOT EXIST». Причина, по которой я это использую, заключается в том, что я не хочу загружать все подключенные entityC из базы данных в память, потому что мне нужно только значение агрегации их свойства. Но проблема здесь в том, что цикл будет запрашивать данные много раз для каждого EntityP!

Поэтому мне интересно, может ли кто-нибудь помочь мне улучшить код для запроса базы данных только один раз, чтобы получить весь набор EntityP.IsAll_C_Complete, без загрузки EntityC в память.

foreach(EntityP p in entityP_List)
                {

                        isAnyNotComoplete = entities.entityC.Any(c => c.IsComplete==false && c.parent.ID == p.ID);
                    p.IsAll_C_Complete = !isAnyNotComoplete;
                }

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 24 апреля 2010

В EF 4 вы можете сделать:

var ids = entityP_List.Select(p => p.ID);
var q = (from p in entities.entityP
         where ids.Contains(p => p.ID)
         select new 
         {
             ID = p.ID,
             IsAll_C_Complete = !p.entityCs.Any(c => !c.IsComplete)
         }).ToList();
foreach (var p in entityP_List)
{
    p.IsAll_C_Complete = q.Where(e.ID == p.Id).Single().IsAll_C_Complete;
}

... который сделает все это в одном запросе к БД. Для EF 1, Google BuildContainsExpression для замены .Contains( части выше.

0 голосов
/ 23 апреля 2010

Я бы основывал EntityP на представлении SQL вместо таблицы. Затем я бы определил отношение и агрегировал значение для дочерней таблицы в представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...