【问题标题】:Linq to SQL using multiple DataContexts in a single query在单个查询中使用多个 DataContexts 的 Linq to SQL
【发布时间】:2009-03-04 17:10:02
【问题描述】:

我有这个 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; 

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

【问题讨论】:

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


    【解决方案1】:

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

    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。

    【讨论】:

    • 感谢 Rex,这些 SQL 的间接成本是多少?我真的很喜欢使用 LINQ2SQL 构建动态 SQL 查询的简单性和简洁性。并且我的 FullTextSearch 返回一个值表,其中包含与 searchString 匹配的行的索引键。在这里加入会最有效吗?
    • 个人成本开销我猜并不是特别大。如果不更熟悉您的应用程序,很难说。但是,当提出性能问题时,SQL 的往返次数始终是首先要考虑的因素之一。
    猜你喜欢
    • 2010-09-28
    • 2011-05-24
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多