2009-05-06 28 views
2

我有14个LINQ查询在一种方法中解决。他们都没有基本查询,我可以将它们作为子查询挂起,然后将结果存储为匿名类型实例的属性。如何在不使用基本查询的情况下在一个操作中解析多个linq查询?

与其单独调用14个数据库,我怎样才能确保它们在同一个操作中都被调用?

UPDATE

我结束了使用该做的伎俩一个狡猾的黑客。我知道,总会有在user表中的至少一个用户,所以我最终使用:

var data = (from tmp in DataContext.Users 
      select new { 
       Property1 = (from...), 
       Property2 = (from...), 
       PropertyN = (from...), 
      }).First(); 

更新2

它的答案中的一个已经暗示,否则可能创建MARS(多活动结果集)错误。这些错误是什么(我从来没有见过),它们为什么会发生,并且在这一问题的整个前提中是否有错误?也就是说,我的观点有缺陷:要求数据库一次性返回所有内容要比完成十四个完全独立的LINQ查询更快更有效?

UPDATE 3

我认为我的做法是多余的,从实用的角度来看,应当以不同方式处理,或者通过存储过程或某种延迟/混合的方法。

+1

也许结果。 – 2009-05-06 19:01:38

回答

3

您仍然通过每个子查询对数据库进行了14次单独调用,您只需在调用数据对象时在单个实例中执行该操作。

编辑:

,当你有一个连接多个打开的数据读取器时出现错误MARS。默认情况下,SQl 2005将关闭。在你的查询中,尽管所有的SQL都在传递中,但你仍然返回14个数据收集器。除非您告诉连接允许多个活动结果集(MARS),否则数据读取器会独占地连接该连接。

要解决此问题,您需要将每个子查询预加载到列表中,然后从该列表中运行子查询,或者需要设置连接字符串= true的MutlipleActiveResultSet属性。

<add name="Name" connectionString="Data Source=<server>;Initial Catalog=<database>;Integrated Security=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/> 
0

我不完全确定你的查询,但你可以将查询逻辑封装在一个存储过程中,将它与LINQ to SQL数据上下文设计器一起使用。

如果你需要独立的结果,你真的不想往返数据库服务器,我认为你应该回退到SqlDataReader并使用NextResult通过调用一个检索整个数据的过程。

+0

每一个都是一个基本的选择语句。 – 2009-05-06 15:18:04

+0

@Nathan:你需要独立的查询结果吗?或者他们相互依赖? – 2009-05-06 15:20:50

0

您可以为每个查询获取SQL代码,然后将其发送到数据块,最后遍历14个结果集。

0

内森,你说查询不一定是相互依赖的,但都是相关的。我们需要知道的是,它们是否实际上有14个不同的结果集,或者它们可以合并成一个结果集。如果是后者,为什么不能为此创建视图或存储过程?在某些情况下,您需要使用判断来辨别何时使用其他路线以获得更好的表现并完成工作。混合方法一点也不差。

如果您需要14个不同的结果集,您可以使用多个活动结果集(MARS),方法是在连接字符串中启用它。这样他们将在一次往返中完成。

0

如果返工你的“狡猾的黑客”应该simulateneously运行查询:

var data = from a in (from x in ... select x) 
      from b in (from x in ... select y) 
      from c in (from x in ... select z) 
      select new { A = a, B = b, C = c }; 
var result = data.First(); 

然而,它会做的所有项目,这可能不是你想要什么发生一个完整的加盟。如果使用查询都返回相同的列数IQueryable.Concat可能工作:

var data = (from x in ... select new { Part = 1, Val = x }) 
    .AsQueryable() // may not be needed in your context 
    .Concat(
     (from y in ... select new { Part = 2, Val = y }) 
      .AsQueryable() 
      .Concat(
       (from z in ... select new { Part = 3, Val = z }).AsQueryable() 
      ) 
    ); 
foreach (result in data) 
{ 
    switch (result.Part) 
    { 
     // process each query's resultset 
    } 
} 

不过狡猾的(和未经测试),但只打了DB一次。

0

我不确定查询用户表是否真的帮助你。

在编写LINQ查询之前,请尝试考虑如何使用基本SQL实现目标。

我不确定你想要做什么,因为你没有提供太多的代码,但是,如果你要在一个存储过程中这样做,那会是什么样子,它会返回什么样的结果?

我在问这个,因为可能你需要的数据结构不适合单个查询。

如果是这样,那么你只需要重新考虑你是整个LINQ方法。

也许你可以提供更多关于什么数据你实际试图检索,以及如何?

欢呼

0

不知道这是否会有所帮助,但想知道为什么你会不使用let关键字,以提高查询。

“让”允许您运行子查询,并存储在一个临时变量,然后你就可以进一步在主查询,如果您有它的代码可能会提供更多刺激的一些样品使用

相关问题