avatasia
V2EX  ›  问与答

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

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

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