我正在使用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;
答案 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
来访问用户。