C# 如何在一个操作中解析多个linq查询而不使用基本查询?

C# 如何在一个操作中解析多个linq查询而不使用基本查询?,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,我有14个LINQ查询需要在一个方法中解决。它们都没有一个基查询,我可以将它们作为子查询挂起,然后将结果存储为匿名类型实例的属性 我如何确保在同一操作中调用它们,而不是分别对数据库进行14次调用 更新 我最后使用了一个狡猾的黑客,成功了。我知道用户表中始终至少有一个用户,因此我最终使用了: var data = (from tmp in DataContext.Users select new { Property1 = (from...)

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

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

更新

我最后使用了一个狡猾的黑客,成功了。我知道用户表中始终至少有一个用户,因此我最终使用了:

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

其中一个答案暗示,这样做可能会产生MARS(多个活动结果集)错误。这些错误是什么(我从未见过),为什么会发生?这一系列问题的整个前提是否有任何错误?i、 e.我的断言是否有缺陷,即要求数据库一次性返回所有内容将比执行14个完全独立的LINQ查询更快/更高效

更新3


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

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


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

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

编辑:

当一个连接有多个打开的数据读取器时,就会发生MARS错误。默认情况下,SQl 2005将关闭此选项。在您的查询中,虽然所有SQL都在一次命中中传递,但仍然返回14个DataReader。datareader独占地使用该连接,除非您告诉该连接允许多个活动结果集(MARS)

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

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


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

Nathan,您说查询不一定是相互依赖的,但都是相关的。我们需要知道的是,它们是否实际上是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
    }
}

仍然不可靠(未经测试),但应该只命中数据库一次。

我不确定从用户表执行查询是否真的对您有帮助

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

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

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

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

也许您可以提供更多关于您实际尝试检索哪些数据以及如何检索的信息


干杯

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


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

每个查询都是一个基本的select语句。@Nathan:您需要独立的每个查询结果吗?或者说他们相互依赖?他们彼此并不依赖,但他们都是相关的。将14条select语句作为单独的查询运行似乎效率低下,因为它们可以在一个请求中收回相同的结果。如果您包含一些代码示例,可能会提供更多的刺激。我同意,您仍然在这里执行14个调用。但在这种情况下,所有SQL一次传递到数据库,然后数据库返回14个结果集,而后一种情况是从web应用程序向数据库发出14个单独的请求,而不是向数据库发出一个请求。如果可以在一个请求中完成,为什么要向数据库发出14个单独的请求呢?当您开始看到MARS错误时,这方面的困难就会显现出来。但是,解决此问题的一种方法是在connectionstring中设置标志(MultipleActiveResultSets=true)。我不熟悉您所指的错误类型。你能给我举个例子吗?System.InvalidOperationException:已经有一个打开的DataReader与此命令关联,必须先关闭它。