首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使LINQ查询更好

使LINQ查询更好
EN

Stack Overflow用户
提问于 2010-08-24 20:26:50
回答 4查看 233关注 0票数 7

我很难弄到LINQ语法..如何以更好的方式执行此命令?

代码语言:javascript
运行
复制
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“这样的短文?我想我已经设置了所有的导航属性,但是我不确定如何正确使用它们,或者我是否可以通过修改它们来使它们更好。

感谢您的阅读

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-24 20:29:48

使用连接将所有内容重写为一个干净的查询。如果我正确阅读了您的查询,这应该会给出正确的结果:

代码语言:javascript
运行
复制
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()

票数 8
EN

Stack Overflow用户

发布于 2010-08-24 23:09:59

请注意,如果您在数据库中设置了正确的外键关系,则Linq-to-Sql应该自动为您提供连接:

代码语言:javascript
运行
复制
var pin = (from u in context.users 
      where u.email == email 
      select u.pintouser.pin).Single(); 

这意味着您可以将其简化为:

代码语言:javascript
运行
复制
var pin = context.users.Where(u=>u.email == email)
                       .Select(u=>u.pintouser.pin)
                       .Single();

(更新注意:我最初建议的是以下内容,这要短得多,但我相信这将导致数据库的两次往返)

代码语言:javascript
运行
复制
var pin = context.users.Single(u=>u.email == email).Single().pintouser.pin;

现在,.pintouser.pin是安全的,因为Single()总是返回一个user对象(或者抛出一个异常)。

票数 3
EN

Stack Overflow用户

发布于 2010-08-24 20:34:41

正如@JustinNiessner指出的那样,你应该使用join,但这是另一种编写查询的方式。

代码语言:javascript
运行
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3556369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档