我有3张桌子:
Table User (UserID, Username)
Table Admin (AdminID, Username)
Table PM (PMID, SenderID, Sendertype, RecipientID, RecipientType)
现在我将在1个查询中
有人有一个想法如何在1个查询中解决?
答案 0 :(得分:0)
为什么不只是有一个用户表,而是用户类型为User或Admin,你可以省去很多麻烦...... LINQ查询直接转换为SQL,所以我不确定你是否可以在一个查询中进行不确定的连接。
或者,如果您不想修改表格,您还可以创建一个基本相同的视图。
或者,编写存储过程。
如果你真的想使用LINQ,你可能不得不做多个查询。您可以将两个User / Admin表与第三个字段合并以进行区分,然后使用该数据集连接到PM表。
答案 1 :(得分:0)
尝试此解决方案
var q = from pm in PM
select new {
pm.PMID,
pm.SenderID,
pm.Sendertype,
pm.RecipientID,
pm.RecipientType,
Username = pm.SenderType == "A" ? pm.Admin.Username :
pm.SenderType == "U" ? pm.User.Username : "",
RecipientType = pm.RecipientType == "A" ? pm.Admin.Username :
pm.RecipientType == "U" ? pm.User.Username : ""
}
答案 2 :(得分:0)
正如我一直建议的那样,打破LinqPad然后玩。除非您正在执行pivot
或bulk insert
语句,否则您无法在T-SQL中执行任何在Linq中无法执行的操作。
这个的诀窍是在Admin
和User
表之间建立联合查询。在那之后,它很容易结合在一起。虽然我把它分成了两个语句,但为了清楚起见 - 实际上只执行了一个查询。如果你急需一个声明,你可以从这里轻松地做到这一点。所以这是你的代码(在LinqPad中验证):
var combined = Admins.Select(a => new {ID = a.AdminID, UserType = "A", Username = a.Username}).Union(
Users.Select(u => new {ID = u.UserID, UserType = "U", Username = u.Username}));
var result = from p in PMs
join sendr in combined on new {ID = p.SenderID, UserType = p.Sendertype} equals new {sendr.ID, sendr.UserType}
join recpt in combined on new {ID = p.RecipientID, UserType = p.RecipientType} equals new {recpt.ID, recpt.UserType}
select new {p, sendr, recpt}; // pretty this anon-type up if desired...
result.Dump();