C# 如何将这些linq查询组合成一个查询?
作为LINQ的新手,我创建了几个查询,并希望将它们合并为一个查询,但我不知道如何实现。这是:C# 如何将这些linq查询组合成一个查询?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,作为LINQ的新手,我创建了几个查询,并希望将它们合并为一个查询,但我不知道如何实现。这是: var u = dc.Users.Where(w => w.UserName == userName).SingleOrDefault(); var m = dc.Memberships.Where(w => w.UserId == u.UserId).SingleOrDefault(); m.PasswordQuestion = securityQuestion; m.Password
var u = dc.Users.Where(w => w.UserName == userName).SingleOrDefault();
var m = dc.Memberships.Where(w => w.UserId == u.UserId).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
dc.Users
是aspnet\u用户表
dc.Membership
是aspnet\u会员资格表
另外,SingleOrDefault
和FirstOrDefault
之间有什么区别?如果序列包含多个元素,SingleOrDefault将抛出错误,FirstOrDefault则不会。在这种情况下,您可能需要FirstOrDefault,因为用户可以有多个成员资格
var m = dc.MemberShips where(w => w.UserId.UserName == userName).FirstOrDefault();
SingleOrDefault的意思是“如果没有元素,给我默认值,如果有,给我默认值,否则抛出异常”。FirstOrDefault的意思是“如果没有元素,那么给我默认值,否则给我第一个”
至于你关于组合查询的问题——为什么?如果代码写得很好,为什么要修改它
回答一个您没有问过的问题:组合查询的常用方法是使用查询延续。一种常见的模式是:
var q1 = from y in something
somequeryclauses;
var q2 = from x in q1
someotherquerqyclauses;
您可以将其编写为一个大查询,如下所示:
var q2 = from x in (from y in something
somequeryclauses)
someotherqueryclauses;
var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault();
var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId
where u.UserName == userName
select u).SingleOrDefault();
这很难理解。您可以将这两个查询与查询延续相结合:
var q2 = from y in something
somequeryclauses
into x
someotherqueryclauses;
有意义吗?我前面没有Visual Studio,但它应该是这样的:
var q2 = from x in (from y in something
somequeryclauses)
someotherqueryclauses;
var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault();
var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId
where u.UserName == userName
select u).SingleOrDefault();
w、 用户允许您跟踪成员资格表和用户表之间的外键链接
如果返回多个结果,SingleOrDefault将引发异常。FirstOrDefault只返回第一条记录。不确定它们是否有关系(应该有关系)。如果是这样,那么LINQtoSQL设计器将为您提供成员身份对象的用户属性(或者反过来)。然后你可以这样写:
var q2 = from x in (from y in something
somequeryclauses)
someotherqueryclauses;
var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault();
var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId
where u.UserName == userName
select u).SingleOrDefault();
如果他们没有关系,你可以这样写:
var q2 = from x in (from y in something
somequeryclauses)
someotherqueryclauses;
var m = dc.Memberships.Where(w => w.Users.UserName == userName).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
var membership = dc.Memberships.Where(x => x.User.UserName == userName).SingleOrDefault();
var membership = (from m in dc.Membership join u in dc.Users on u.UserId equals m.UserId
where u.UserName == userName
select u).SingleOrDefault();
SingleOrDefault()和FirstOrDefault()之间的区别在于SingleOrDefault()假定与查询匹配的项不超过一个。如果两个项与查询匹配,则将引发异常。如果您使用FirstOrDefault(),并且有两项与查询匹配,则会选择第一项。您的第二个问题是重复的: