V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
avatasia
V2EX  ›  问与答

linq用不好真的是个噩梦,一个简单的sql语句,用linq之后变成几百次查询

  •  
  •   avatasia · 2012-05-21 16:32:57 +08:00 · 3111 次点击
    这是一个创建于 4362 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有谁有linq经验分享的,可做不可做方面的例子
    8 条回复    1970-01-01 08:00:00 +08:00
    haohaolee
        1
    haohaolee  
       2012-05-21 17:03:32 +08:00
    能不能分享下那个几百次查询的例子
    leqoqo
        2
    leqoqo  
       2012-05-21 17:37:06 +08:00
    很多书,很少看,在一个很小的项目里用过一点皮毛
    magicshui
        3
    magicshui  
       2012-05-21 17:42:09 +08:00
    想瞅瞅这条吓人的LINQ :D
    icyflash
        4
    icyflash  
       2012-05-21 18:09:49 +08:00
    linqpad是个好工具
    gDD
        5
    gDD  
       2012-05-21 18:30:49 +08:00
    我想你把你那个例子贴出来我们的看帖愉悦度会高很多,这种什么都没有的烂问题在Stack Overflow不被down vote到18层地狱。。。
    avatasia
        6
    avatasia  
    OP
       2012-05-22 13:42:14 +08:00
    @gDD
    @icyflash
    @magicshui
    @leqoqo
    @haohaolee

    public class User
    {
    [Key]
    public int UserID { get; set; }
    [Required]
    [DisplayName("登陆名")]
    public string NickName { get; set; }
    [Required]
    [DisplayName("用户姓名")]
    public string UserName { get; set; }
    [Required]
    [DisplayName("联系电话")]
    public string Phone { get; set; }
    [Required]
    [DisplayName("用户组")]
    public int GroupID { get; set; }
    public virtual IList<UserRight> UserRights { get; set; }
    }


    public class UserRight
    {
    [Key]
    public int UserRightID { get; set; }
    public int UserID { get; set; }
    public int RightID { get; set; }
    public bool? AsParent { get; set; }
    public bool? AsDefault { get; set; }

    public virtual User User { get; set; }
    public virtual Right Right { get; set; }
    }

    下面是linq语句,查询某个User之后,获取其所有的Rights
    var rights = user.UserRights.Select(ur=>ur.Right).ToList();

    这个用sql profile看就变成n条查询了。
    avatasia
        7
    avatasia  
    OP
       2012-05-22 14:18:17 +08:00
    Rights.Where(r=>UserRights.Where(ur=>ur.UserID == Users.Single(u=>u.NickName =="hjwr").UserID).Select(ur=>ur.RightID).Contains(r.RightID))

    这个是今天优化的

    在c#里用的时候,得要改成这样
    var rights =db.Rights.Where(r=>db.UserRights.Where(ur=>ur.UserID ==db.Users.FirstOrDefault(u=>u.NickName =="hjwr").UserID).Select(ur=>ur.RightID).Contains(r.RightID));
    不能使用Single,必须是FirstOrDefault.
    icyflash
        8
    icyflash  
       2012-05-22 14:23:10 +08:00
    UserRights.Where(ur=>ur.User.UserId==***).Select (ur => ur.Right).ToList()

    不知道你是怎么查询user的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2611 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:47 · PVG 22:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.