我还在学习开发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
答案 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