如何在不使用基本查询的情况下在一个操作中解析多个linq查询?

我有一个方法可以解决14个LINQ查询。 它们都没有基本查询,我可以将它们作为子查询挂起,然后将结果存储为匿名类型实例的属性。

而不是对数据库进行14次单独调用,如何确保在同一操作中调用它们?

UPDATE

我最终使用了一个狡猾的黑客来完成这个伎俩。 我知道用户表中总会至少有一个用户,所以我最终使用:

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

更新2

在其中一个答案中暗示,这样做可能会产生MARS(多个活动结果集)错误。 这些错误是什么(我从未见过),它们为什么会出现,这一问题的整个前提是否有任何错误? 即我的断言中,我要求数据库一次性返回所有内容,这比使用十四个完全独立的LINQ查询更快/更有效吗?

更新3

我认为我的方法是多余的,从务实的角度来看,应该通过存储过程或某种延迟/混合方法来区别对待。

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

编辑:

当您有多个用于连接的打开数据读取器时,会发生MARS错误。 默认情况下,SQl 2005会关闭此function。 在您的查询中,当所有SQL传入时,您仍然返回14个数据站。 除非您告知连接允许多个活动结果集(MARS),否则datareader将独占地连接该连接。

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

  

我不完全确定您的查询,但您可以将查询逻辑封装在存储过程中,使用LINQ to SQL数据上下文设计器将其拖放。

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

您可以为每个查询获取SQL代码,然后在一个批处理中将其发送到DB,最后迭代14个结果集。

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

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

如果你重写你的’狡猾的黑客’,它应该模拟运行查询:

 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。

我不确定从Users表中查询是否真的对你有所帮助。

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

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

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

如果确实如此,那么您只需要重新考虑整个LINQ方法。

也许你可以提供更多关于你实际想要检索的数据的信息,以及如何?

干杯

不确定这是否有帮助,但想知道为什么不使用let关键字来增强查询。

‘let’允许您运行子查询并将结果存储在临时变量中,然后您可以在主查询中进一步使用该变量