Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将这些linq查询组合成一个查询?_C#_Linq_Linq To Sql - Fatal编程技术网

C# 如何将这些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

作为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.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(),并且有两项与查询匹配,则会选择第一项。

您的第二个问题是重复的: