LINQ EF从2个不同的数据上下文加入查询

时间:2015-08-12 08:07:22

标签: c# sql asp.net linq entity-framework

我正在使用LINQ从我的EF上下文以及Asp .Net Identity 2.0中检索数据 - 两者都位于同一个MS SQL Server数据库中。

我的问题是LINQ将它们视为数据上下文的两种不同情况,并且无法处理查询。

"The specified LINQ expression contains references to queries that are associated with different contexts."

我想要实现的是从EF表中简单返回10个顶级项目(我在代码提取中跳过此内容),之前通过ASP .NET Identity表中的UserName排序。

我在StackOverflow上看到过这个问题的一些例子,但在我的情况下我无法应用任何解决方案。

首选解决方案当然不是下载所有表数据并在服务器上进行排序。

有问题的查询:

var dbDataSorted = from entry in dbData
        join user in this.UserManager.Users
        on entry.UserId equals new Guid(user.Id)
        orderby user.UserName ascending
        select entry;
return dbDataSorted;

4 个答案:

答案 0 :(得分:1)

您无法使用Linq to Entities和Linq在一个查询中进行对象。这是因为当您查询IQueryable接口的实例时,查询将转换为SQL,而在SQL中,您无法使用任何IEnumerable集合。所以你应该从数据库中获取数据(例如dbData.AsEnumerable())。 但是如果你想在 SQL Server端上完成所有工作,最简单的方法是创建sql过程并将users表作为参数传递。将用户表作为xml传递的最简单方法,而不是在服务器端的过程中解析它。

答案 1 :(得分:1)

LINQ和EF很酷。但有时候,它的抽象并没有提供你所需要的东西。

回到基础,手工编写查询,将其放在一个字符串中,使用SqlQuery方法对yourcontext.YourDbSet运行它,并完成它。

var query = @"SELECT * FROM dbData as entry
              INNER JOIN Users
              ON entry.UserId = Users.Id
              ORDER BY Users.Username";

yourcontext.dbData.SqlQuery(query);

如果提供给你的抽象不能满足你的需要,那么滥用抽象来做一些奇怪的东西远不如使用低层界面那么清楚。

答案 2 :(得分:1)

通过使用AsEnumerable(),我能够在我的案例中使用它。 YMMV。

在你的情况下:

'use strict';
const nodemailer = require('nodemailer');

// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
nodemailer.createTestAccount((err, account) => {

    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: 'smtp.ethereal.email',
        port: 587,
        secure: false, // true for 465, false for other ports
        auth: {
            user: account.user, // generated ethereal user
            pass: account.pass  // generated ethereal password
        }
    });

    // setup email data with unicode symbols
    let mailOptions = {
        from: '"Fred Foo " <foo@blurdybloop.com>', // sender address
        to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
        subject: 'Hello ✔', // Subject line
        text: 'Hello world?', // plain text body
        html: '<b>Hello world?</b>' // html body
    };

    // send mail with defined transport object
    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            return console.log(error);
        }
        console.log('Message sent: %s', info.messageId);
        // Preview only available when sending through an Ethereal account
        console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));

        // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@blurdybloop.com>
        // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
    });
});

答案 3 :(得分:0)

如果您首先使用ASP.NET Identity 2代码,那么您的DbContext可能会继承自IdentityDbContext<>,因此您可以直接从上下文访问Users表。您不需要使用UserManager来访问用户。