我很难弄到LINQ语法..如何以更好的方式执行此命令?
var user = (from u in context.users
where u.email.Equals(email)
select u).Single();
var pinToUser = (from ptu in context.pintousers
where ptu.user_id.Equals(user.id)
select ptu).Single();
var pin = (from p in context.pins
where p.idpin.Equals(pinToUser.pin_idpin)
select p).Single();
return pin;
如你所见,有一个表格用户,一个表格用户和一个表格别针。Pintouser引用user和pin。有没有可能写一些像"user.pintouser.pin“这样的短文?我想我已经设置了所有的导航属性,但是我不确定如何正确使用它们,或者我是否可以通过修改它们来使它们更好。
感谢您的阅读
发布于 2010-08-24 20:29:48
使用连接将所有内容重写为一个干净的查询。如果我正确阅读了您的查询,这应该会给出正确的结果:
var pin = (from u in context.users
join ptu in context.pintousers on u.id equals ptu.user_id
join p in context.pins on ptu.pin_idpin equals p.idpin
where u.email == email
select p).Single();
但是请记住,如果此查询返回的不是单个结果,您的代码将抛出异常。
如果您想要处理获得一行或没有行的可能性,那么您应该使用SingleOrDefault()
。
如果您想处理获取任意数量行的可能性,那么您应该真正使用FirstOrDefault()
。
发布于 2010-08-24 23:09:59
请注意,如果您在数据库中设置了正确的外键关系,则Linq-to-Sql应该自动为您提供连接:
var pin = (from u in context.users
where u.email == email
select u.pintouser.pin).Single();
这意味着您可以将其简化为:
var pin = context.users.Where(u=>u.email == email)
.Select(u=>u.pintouser.pin)
.Single();
(更新注意:我最初建议的是以下内容,这要短得多,但我相信这将导致数据库的两次往返)
var pin = context.users.Single(u=>u.email == email).Single().pintouser.pin;
现在,.pintouser.pin
是安全的,因为Single()
总是返回一个user
对象(或者抛出一个异常)。
发布于 2010-08-24 20:34:41
正如@JustinNiessner指出的那样,你应该使用join
,但这是另一种编写查询的方式。
var user = context.users.Single(u => u.email == email);
var pinToUser = context.pintousers.Single(ptu => ptu.user_id == user.id);
var pin = context.pins.Single(p => p.idpin == pinToUser.pin_idpid);
https://stackoverflow.com/questions/3556369
复制相似问题