在使用EF 4.3的LINQ查询中使用“let”关键字

时间:2012-02-28 10:12:41

标签: c# .net linq entity-framework let

我有简单的LINQ问题,我无法弄清楚。 我有一个表Users和一个表Employees一个用户可以拥有0 ... n名员工。

我想做这样的事情:

var result = from u in context.users
             where u.UsrId = 2
             let e = u.Employees.First()
             select new 
{
  UserId = u.UsrId,
  FirstName = e.FirstName
};

当然,First()电话是非法的,这当然不起作用。 First()只能在select结束时出现。 什么也行不通的是在之前的查询中选择员工,如下所示:

var employee = from e. in context.Employees.....

...然后说let e = employee而不是let e = u.Employees().First()

我不确定使用是否正确。我认为这是针对子查询的。

First()调用的原因是Employees表不应为每个用户提供多个条目。这是设计中的一个错误,我现在必须处理它。所以我只想要第一个。

2 个答案:

答案 0 :(得分:4)

var result = from u in context.users
let e = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId)
where u.UsrId = 2
select new  {   UserId = u.UsrId,   FirstName = e.FirstName }; 

没有经过测试,只是一个tipp。

答案 1 :(得分:1)

首先可以使用,除了在LINQ查询语句的中间,当将该语句转换为SQL时,实际上没有办法构成First,因为它的行为是抛出错误。然而,FirstOrDefault可以转换为Top(1),这是它转换为SQL的方式。这意味着在SQL可翻译语句的中间首先使用并不是真的有效,但是我相信他们已经允许这作为最后一个语句,因为零结果可以转换为查询执行后的异常。