V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
avatasia
V2EX  ›  问与答

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

  •  
  •   avatasia · May 21, 2012 · 3709 views
    This topic created in 5090 days ago, the information mentioned may be changed or developed.
    有谁有linq经验分享的,可做不可做方面的例子
    8 replies    1970-01-01 08:00:00 +08:00
    haohaolee
        1
    haohaolee  
       May 21, 2012
    能不能分享下那个几百次查询的例子
    leqoqo
        2
    leqoqo  
       May 21, 2012
    很多书,很少看,在一个很小的项目里用过一点皮毛
    magicshui
        3
    magicshui  
       May 21, 2012
    想瞅瞅这条吓人的LINQ :D
    icyflash
        4
    icyflash  
       May 21, 2012
    linqpad是个好工具
    gDD
        5
    gDD  
       May 21, 2012
    我想你把你那个例子贴出来我们的看帖愉悦度会高很多,这种什么都没有的烂问题在Stack Overflow不被down vote到18层地狱。。。
    avatasia
        6
    avatasia  
    OP
       May 22, 2012
    @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
       May 22, 2012
    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  
       May 22, 2012
    UserRights.Where(ur=>ur.User.UserId==***).Select (ur => ur.Right).ToList()

    不知道你是怎么查询user的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5383 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    ♥ Do have faith in what you're doing.