需要LINQ-Query的帮助

时间:2010-12-13 00:22:39

标签: asp.net sql linq

我有3张桌子:

Table User (UserID, Username)
Table Admin (AdminID, Username)
Table PM (PMID, SenderID, Sendertype, RecipientID, RecipientType)

现在我将在1个查询中

  • 从PM获取所有信息
  • 如果SenderType =='A'将SenderID加入Admin-Table,请获取用户名
  • 如果SenderType =='U'将SenderID加入User-Table,请获取用户名
  • 如果RecipientType =='A'将RecipientID加入Admin-Table,请获取用户名
  • 如果RecipientType =='U'将RecipientID加入用户表,获取用户名

有人有一个想法如何在1个查询中解决?

3 个答案:

答案 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然后玩。除非您正在执行pivotbulk insert语句,否则您无法在T-SQL中执行任何在Linq中无法执行的操作。

这个的诀窍是在AdminUser表之间建立联合查询。在那之后,它很容易结合在一起。虽然我把它分成了两个语句,但为了清楚起见 - 实际上只执行了一个查询。如果你急需一个声明,你可以从这里轻松地做到这一点。所以这是你的代码(在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();