Linq to SQL在单个查询中使用多个DataContexts

时间:2009-03-04 17:10:03

标签: c# .net asp.net linq linq-to-sql

我有这个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()或全文搜索。它们与Projects表位于.dbml文件中。

所以现在我有:

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

我的问题是,如何在原始查询p上使用这些新的objDBContexts?我也想知道如何将executequery()映射回原始查询。

类似的东西:

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

    select p; 

我希望这是有道理的。我有一些类型不匹配的错误,并尝试谷歌搜索一段时间,但找不到任何东西。

1 个答案:

答案 0 :(得分:2)

由于您已在上下文类中定义了所有方法,因此对所有这三个方法使用相同的实例:

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不能,也不打算在100%的时间内替换SQL。