LINQ Lambda - 加入,与众不同

时间:2014-12-01 01:06:12

标签: c# linq lambda

我还在学习开发LINQ lambda表达式。

我有一个父表Requests和一个子表赞助商,它将有0或1行与请求相关联。我想展示一个用户可能已经在他/她之前的任何请求中定义的过去赞助商的列表。

第一:我可以找到用户输入的所有先前请求(Request.UserId == 1111);

第二:表格由RequestId关联(request.RequestId == Sponsor.RequestId);

第三:我想根据不同的Sponsor.Email限制返回的行数(根据不同的Sponsor.Email返回最大的Sponsor.RequestId);

第4页:我希望他们使用最新的赞助商订购(按降序Sponsor.RequestId排序);

最后一个警告,我只想返回赞助商记录的是Sponsor.LastNm不为空(以前的升级问题)。

所以我很接近,但我没有根据电子邮件过滤掉:

db.Requests
   .Where (req => req.UserID == 1111)
   .Join(db.Sponsors, 
      req => req.RequestID, 
      spon => spon.RequestID, 
      (req, spon) => new { Requests = req, Sponsors = spon })
   .Where(both => both.Sponsors.LastNm != null)
   .OrderByDescending(both => both.Sponsors.RequestID);

至少我需要返回Request.DateRequested和整个赞助商行。

请求表(仅限某些列)

RequestId    UserId   DateRequested
12           1111     2013-10-12
34           1111     2013-10-23
56           2222     2013-10-25
87           1111     2013-11-02
99           1111     2013-11-15

赞助商表(仅限某些栏目)

RequestId   Email                LastNm
12          abc.xyz.com
34          abc@xyz.com          Doe
87          abc@xyz.com          Doe
99          def@xyz.com          Doe

所以我希望返回以下行

Request.DateRequested   Sponsor
2013-11-15              99, def@xyz.com, Doe
2013-11-02              87, abc@xyz.com, DOe

1 个答案:

答案 0 :(得分:3)

我发现以查询语法风格编写LINQ查询更容易。它确实提高了我的可读性。

        var qry = from r in db.Requests
                  join s in db.Sponsors on r.RequestID equals s.RequestID
                  where r.UserID == 111 &&
                    s.LastNm != null
                  orderby s.RequestID descending
                  group new { Request = r, Sponsor = s } by s.EMail into g
                  select g.First();

坚持功能表示法,它将是:

        var qry = db.requests
            .Where(req => req.UserID == 111)
            .Join(db.sponsors,
            req => req.RequestID,
            spon => spon.RequestID,
            (req, spon) => new { Requests = req, Sponsor = spon })
            .Where(both => both.Sponsor.LastNm != null)
            .OrderByDescending(both => both.Sponsor.RequestID)
            .GroupBy(both => both.Sponsor.EMail)
            .Select(group => group.First());

这会产生我认为你想要的结果。使用两个单独数组中的数据的本地副本,并使用以下循环:

        foreach (var rec in qry)
            Console.WriteLine("{0}\t{1}\t{2}\t{3}", rec.Request.DateRequested, rec.Request.RequestID, rec.Sponsor.EMail, rec.Sponsor.LastNm);

我明白了:

11/15/2013 12:00:00 AM  99      def@xyz.com     Doe
11/2/2013 12:00:00 AM   87      abc@xyz.com     Doe

此外,如果您在数据库中具有参照完整性并且正在使用EntityFramework(或OpenAccess),则可以使用两个from替换连接。

from r in requests
from s in r.sponsors