none
Не работают несколько join для связи с несколькими таблицами RRS feed

  • Вопрос

  • Здравствуйте. Подскажите пожалуйста почему не работает такой запрос ?(точнее не находит результатов)

    var containerInfo = from notify in context.NotificationEFObj
                                   join e in context.EtpObj on notify.newId equals e.etpId
                                        join respInfo in context.ResponsibleInfoObj on notify.newId equals respInfo.ResponsibleInfoId
                                        join respOrg in context.ResponsibleOrgObj on notify.newId equals respOrg.ResponsibleOrgId
                                        join contactPerson in context.ContactPersonObj on respInfo.ResponsibleInfoId equals contactPerson.RespInfoContrPerId
                                        where e.name.Contains("Сбербанк")
                                        select new BodyMessageInfo
                                        {
                                            idEntity = notify.newId,
                                            etpname = e.name,
                                            datepublishtender = notify.docPublishDate,
                                            hreflink = notify.href,
                                            purchaseNumber = notify.purchaseNumber,
                                            tendername = notify.purchaseObjectInfo,
                                            contactperson = contactPerson.firstName + contactPerson.middleName + contactPerson.lastName,
                                            contactEmail = respInfo.contactEMail,
                                            purchaseOrgname = respOrg.fullName
                                        };

    Но если по одиночке делать для каждой таблицы (к примеру так)

    var containerInfo = from notify in context.NotificationEFObj
                                   join e in context.EtpObj on notify.newId equals e.etpId

    то результаты находит. Что я не так делаю ?

    14 января 2015 г. 5:27

Ответы

  • Ну значит у вас действительно по бизнес логике нет таких сущностей. Выбирайте несколькими запросами и объединяйте результаты через union.

    • Помечено в качестве ответа Timur2008 14 января 2015 г. 7:02
    14 января 2015 г. 6:31
    Отвечающий
  • Если у вас отношение один-к-одному, то я бы не мучал ни себя, ни сервер и собрал бы все это в одну таблицу.

    Теперь по вашей задаче.

    1. Первичный ключ называйте всегда Id. Очень сильно рекомендую, в этом случае не вы, ни никто другой его не спутает.

    2. Объявляет класс NotificationEF, я ведь правильно понимаю, что он у вас корневой?

    public class NotificationEF
    {
            public string OldId { set; get; }
            public string externalId { set; get; }
            *************************
            public string contractServiceInfo { set; get; }
            [Key]
    	public int Id { set; get; }
    }

    3. Остальные классы, кроме ContactPersons объявляете как потомков NotificationEF. А, соответственно, ContactPersons  делаете потомком ResponsibleInfo. В этих классах объявляете только уникальные для этих классов поля и не объявляете ни в коем случае первичный ключ.

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

    • Помечено в качестве ответа Timur2008 14 января 2015 г. 8:59
    14 января 2015 г. 8:23
    Отвечающий

Все ответы

  • Добрый день.

    Если все четыре запроса join по отдельности работают, то есть два варианта:

    1. У вас нет ни одной записи удовлетворяющей Where

    2. У вас нет ни одной записи которой есть соответствие во всех пяти таблицах. Например, у вас есть запись в NotificationEFObj и есть связанная с ней запись в ResponsibleInfoObj, но нет с ней связанной записи в ResponsibleOrgObj.

    P.s. Внутренний голос мне подсказывает, что проблему описанную вот здесь вы уже решили. Закройте топик.

    14 января 2015 г. 5:58
    Отвечающий
  • Аа да закрыл, да вот в том то и дело что я уже думал про такие варианты и там вроде все нормально. Вообщем когда один join то все работает, а если сразу больше , хотябы две то уже не работает :( сейчас where вообще убрал но всеравно не работает
    • Изменено Timur2008 14 января 2015 г. 6:20
    14 января 2015 г. 6:15
  • Ну значит у вас действительно по бизнес логике нет таких сущностей. Выбирайте несколькими запросами и объединяйте результаты через union.

    • Помечено в качестве ответа Timur2008 14 января 2015 г. 7:02
    14 января 2015 г. 6:31
    Отвечающий
  • Да придется похоже так делать ,хоть и странно это блин :(
    14 января 2015 г. 7:01
  • Скажите может быть я не правильно сами связи делаю ? Вот к примеру связь между Notification и другими сущностями 

     public class NotificationEF
        {
            public string id { set; get; }
            public string externalId { set; get; }
            *************************
            public string contractServiceInfo { set; get; }
            [Key]
            public int newId { set; get; }
        }
    
       
    
        public class ETP
        {
            [Key]
            public int etpId { set; get; }
            [ForeignKey("etpId")]
            public NotificationEF NotifyEtp { set; get; }
            ****************************************
        }
    
        public class ResponsibleOrg
        {
            ************************************
            [Key]
            public int ResponsibleOrgId { set; get; }
            [ForeignKey("ResponsibleOrgId")]
            public NotificationEF NotificationEFId { set; get; }
        }

    14 января 2015 г. 7:51
  • А можно картинку с моделью базы данных которую вы хотите получить. Что-то вида:

    Таблички, столбцы в них и какие связи вы хотите между ними получить...

    14 января 2015 г. 7:58
    Отвечающий
  • И, кстати, а почему, раз у вас это вызывает такие проблемы, вы не откажетесь от Code-First в пользу Model-First?

    14 января 2015 г. 7:58
    Отвечающий
  • вот так поидее должно быть 
    14 января 2015 г. 8:02
  • Ну просто EF  я начал уже использовать после того как создал все эти сущности, просто я в начале хотел использовать просто sql запросы , но потом узнал про EF и решил его использовать
    14 января 2015 г. 8:04
  • Если у вас отношение один-к-одному, то я бы не мучал ни себя, ни сервер и собрал бы все это в одну таблицу.

    Теперь по вашей задаче.

    1. Первичный ключ называйте всегда Id. Очень сильно рекомендую, в этом случае не вы, ни никто другой его не спутает.

    2. Объявляет класс NotificationEF, я ведь правильно понимаю, что он у вас корневой?

    public class NotificationEF
    {
            public string OldId { set; get; }
            public string externalId { set; get; }
            *************************
            public string contractServiceInfo { set; get; }
            [Key]
    	public int Id { set; get; }
    }

    3. Остальные классы, кроме ContactPersons объявляете как потомков NotificationEF. А, соответственно, ContactPersons  делаете потомком ResponsibleInfo. В этих классах объявляете только уникальные для этих классов поля и не объявляете ни в коем случае первичный ключ.

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

    • Помечено в качестве ответа Timur2008 14 января 2015 г. 8:59
    14 января 2015 г. 8:23
    Отвечающий
  • Понял спасибо , а покажите пожалуйста на примере как объявить оставшиеся классы потомками NotificationEF? Всеравно надо разобраться в чем тут ошибка иначе в следующий раз всеравно на подобной же вещи споткнусь
    14 января 2015 г. 8:49
  • Классически, как для обычного наследования: public class ResponsibleInfo NotificationEF { ...

    14 января 2015 г. 8:50
    Отвечающий
  • Понял спасибо :) сейчас попробую
    14 января 2015 г. 8:59
  • Понял спасибо :) сейчас попробую

    Пожалуйста. На будущее, старайтесь один топик - один вопрос. Чтобы потом по форуму было легче искать. А то сейчас никто по заголовку не догадется, что в нем приведен пример создания связей один-к-одному в Entity Framework Code-First.
    14 января 2015 г. 9:08
    Отвечающий
  • хорошо:)
    14 января 2015 г. 10:08