Проблема запроса LINQ в DataContext - PullRequest
0 голосов
/ 13 марта 2012
 var activecommcontacts = 
   CorporateCalendarDataContext.ActiveCommunicationContacts.Where(p=>systemUserMinistries.Contains(p.MinistryId)).Select(p => p);                                  
    var distinctcomm = 
   CorporateCalendarDataContext.ActiveDistinctCommunicationContacts.Select(r => r);        

    IQueryable<ActiveDistinctCommunicationContact> options   
             = (from orig in distinctcomm   
                      let userid = orig.SystemUserId   
                      let name = orig.Name   
                      let nameandnumber = orig.NameAndNumber   
                      from b in activecommcontacts   
                      let actuserid = b.SystemUserId  
                      where userid == actuserid  
                      select new ActiveDistinctCommunicationContact  
                                 {  
                                     Name = name,  
                                     SystemUserId = userid,  
                                     NameAndNumber = nameandnumber  
                                 }).AsQueryable();        

Я получаю SystemInvalidOperationException с сообщением
"Запрос содержит ссылки на элементы, определенные в другом контексте данных."

Я даже пытался обойти это, делая это следующим образом:

IQueryable<ActiveDistinctCommunicationContact> options = 
(from distinctcomm in CorporateCalendarDataContext.ActiveDistinctCommunicationContacts
 from activecommcontacts in activecommcontacts
 where activecommcontacts.SystemUserId == distinctcomm .SystemUserId
 select new 
    { 
        distinctcomm .SystemUserId, 
        distinctcomm .Name, 
        distinctcomm.NameAndNumber 
    }).AsQueryable();                                      

Я получаю исключение SystemInvalidOperationException с сообщением

"Запрос содержит ссылки на определенные элементыв другом контексте данных. "

Я хотел бы отметить, что ActiveDistinctCommunicationContact и ActiveCommunicationContact являются VIEWS в одном и том же текстовом тексте CorporateCalendarDataContext.
Я даже обновил свой DBML в конструкторе.
Но я продолжаю получать это надоедливое исключение "Запрос содержит ссылкик элементам в другом контексте данных ".Я не понимаю, почему это происходит, когда представления принадлежат одному и тому же контексту данных.Я обратился к некоторым из этих проблем на stackoverflow.com, но просто не могу заставить этот запрос работать.Можете ли вы помочь, пожалуйста.

public List<int> GetSystemUserMinistryList() {
    var dc = new CorporateCalendar.Data.CorporateCalendarDataContext(); //"param1", "param2", "param3");
    List<int> userMinistries = new List<int>();
    var systemUserMinistries = dc.GetTable<CorporateCalendar.Data.ActiveSystemUserMinistry>();
    foreach (CorporateCalendar.Data.ActiveSystemUserMinistry activeSystemUserMinistry in systemUserMinistries) { 
        if (activeSystemUserMinistry.SystemUserId == this.Id) {
            userMinistries.Add(activeSystemUserMinistry.MinistryId);
        }
    }

    return userMinistries;
}

private static CorporateCalendarDataContext CorporateCalendarDataContext {
    get { 
        var dc = new CorporateCalendarDataContext(); //"param1", "param2", "param3");
        return dc;
    }
}

1 Ответ

2 голосов
/ 13 марта 2012

Если я правильно понял ваш вопрос и обновления ...

Мне кажется, у вас есть свойство:

private static CorporateCalendarDataContext CorporateCalendarDataContext {
    get {
        var dc = new CorporateCalendarDataContext(); //"param1", "param2", "param3");
        return dc;
    }
}

, поэтому каждый раз, когда вы получаете это свойство, вы получаетеновый экземпляр контекста, созданный таким образом, хотя эти две строки, например:

var activecommcontacts = CorporateCalendarDataContext.ActiveCommunicationContacts.Where(p=>systemUserMinistries.Contains(p.MinistryId)).Select(p => p);                                  
var distinctcomm = CorporateCalendarDataContext.ActiveDistinctCommunicationContacts.Select(r => r);  

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

ВыВам нужно хранить контекст дольше, чем вы, поэтому сделайте это:

var context = CorporateCalendarDataContext;
var activecommcontacts = context.ActiveCommunicationContacts.Where(p=>systemUserMinistries.Contains(p.MinistryId)).Select(p => p);                                  
var distinctcomm = context.ActiveDistinctCommunicationContacts.Select(r => r);  
// This context should be used for anything that you want to join together in the same query ...      

или сделайте так, чтобы это свойство сохраняло контекст после его создания, например:

private static CorporateCalendarDataContext _context;
private static CorporateCalendarDataContext CorporateCalendarDataContext {
    get {
        if(_context == null)
            _context = new CorporateCalendarDataContext(); //"param1", "param2", "param3");
        return _context;
    }
}

Что бы вы ни чувствовали себя более довольным, и это соответствует дизайну вашего приложения.

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

Вы должны быть осторожны с контекстами данных и их временами жизни, поскольку они хитры, но о них доступно много информации.Взгляните на эту статью в блоге, например: Best Entity Framework Lifetime Best Practices и этот пост: Как определить время жизни для вашего объектаcontext .

...