Linq to SQL, используя несколько DataContexts в одном запросе - PullRequest
3 голосов
/ 04 марта 2009

У меня есть последовательность запросов Linq to SQL, которая в основном возвращает поиск в таблице с именем PROJECTS. и я использую отложенное выполнение, чтобы медленно его наращивать.

var query = from p in objDBContext.PROJECTs
where (p.PROVIDER_ID == cwForm.productForm) 
select p; 

query = from p in query
where p.SubmittedDate >= cwForm.beginDateForm
select p;

Я написал несколько функций SQL, которые возвращают скалярные и табличные значения в качестве вспомогательной функции, потому что LINQ не поддерживает ISDATE() или полнотекстовый поиск. они находятся в том же файле .dbml, что и таблица Projects.

Так что теперь у меня есть:

var dateQuery = from d in objDBContext.ISDATE   
select d;
//returns a bool

var ftsQuery = from f in objDBContext.FullTextSearch
select f;
//returns a valued-table with the primary keys of hits with fulltextsearch

Мой вопрос: как мне использовать эти новые objDBContexts в исходном запросе p? Мне также интересно выяснить, как отобразить executequery () обратно в исходный запрос.

Что-то вроде:

query = from p in query
        from d in dateQuery
        from f in ftsQuery
where d.ISDATE(p.Field1) &&  f.FullContextSearch(searchString)    

    select p; 

Надеюсь, это имеет смысл. У меня несколько несовпадающих типов ошибок, и я некоторое время пытался поискать в Google, но ничего не смог найти.

1 Ответ

2 голосов
/ 04 марта 2009

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

var query = from p in objDBContext.Projects where
    p.PROVIDER_ID == cwForm.productForm 
    && objDBContext.ISDATE(p.Field1)
    && objDBContext.FullTextSearch(searchString)
        //assuming FullTextSearch returns boolean
    select p

если FullTextSearch не возвращает логическое значение, вам нужно создать выражение, которое это делает. Например, если он вернет IList, вы можете сделать objDBContext.FullTextSearch(searchString).Contains(p)

Хотя имейте в виду, что то, что вы пытаетесь сделать, повлечет за собой три обращения к базе данных независимо от того, каким образом вы ее сократите. В этом случае может быть лучше просто вручную создать свой SQL. LINQ to SQL не может и не предназначен для замены SQL в 100% случаев.

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