LINQ使用延迟执行模型,这意味着在调用Linq运算符时不返回结果序列,而是这些运算符返回一个对象,该对象只有在枚举此对象时才会生成序列的元素.
虽然我理解延迟查询是如何工作的,但我在理解延迟执行的好处时遇到了一些麻烦:
1)我已经读过只有在你真正需要结果时执行的延迟查询才会有很大的好处.那么这个好处是什么?
2)延迟查询的其他优点是,如果您定义一次查询,那么每次枚举结果时,如果数据发生更改,您将得到不同的结果.
a)但是从下面的代码中可以看出,我们能够实现相同的效果(因此,每次枚举资源时,如果数据发生变化,我们会得到不同的结果),即使不使用延迟查询:
List<string> sList = new List<string>( new[]{ "A","B" });
foreach (string item in sList)
Console.WriteLine(item); // Q1 outputs AB
sList.Add("C");
foreach (string item in sList)
Console.WriteLine(item); // Q2 outputs ABC
Run Code Online (Sandbox Code Playgroud)
3)延期执行是否还有其他好处?
可能是一个愚蠢的问题,因为我可能已经回答了我的问题,但我只是想确定我没有遗漏某些东西
在编译时在已检查的上下文中计算常量表达式.我认为不应该在编译时评估以下表达式,因为我假设C#只在左侧的所有操作数都是常量时才将特定表达式视为常量表达式:
int i= 100;
long u = (int.MaxValue + 100 + i); //error
Run Code Online (Sandbox Code Playgroud)
相反,看起来编译器会考虑任何子表达式,其中两个操作数都是常量作为常量表达式,即使表达式中的其他操作数是非常量?因此编译器可能只在编译时计算表达式的一部分,而表达式的剩余部分(包含非常量值)将在运行时进行评估 - >我假设在以下示例中仅(200 +100)在编译时进行评估
int i=100;
long l = int.MaxValue + i + ( 200 + 100 ); // works
Run Code Online (Sandbox Code Playgroud)
我的假设是否正确?
感谢名单
静态方法Object.Equals(Object, Object)支持引用类型的引用相等性和值类型的按位相等性,其中具有逐位相等性的比较对象具有相同的二进制表示,而比较的值相等对象具有相同的值,即使它们具有不同的二进制表示.
例如,由于i1和b1不同类型,它们没有相同的二进制表示,因此Object.Equals(Object, Object)返回false:
int i1 = 100;
byte b1 = 100;
Console.WriteLine(Object.Equals(i1, b1));//false
Run Code Online (Sandbox Code Playgroud)
Object.Equals(Object, Object)也应该在比较时返回false d1并且d2(因为两个变量具有相同值的不同二进制表示),但它返回true,这表明它使用值相等来比较它们:
decimal d1 = 1.10M;
decimal d2 = 1.100M;
Console.WriteLine(Object.Equals(d1, d2)); //true
Run Code Online (Sandbox Code Playgroud)
不应该Object.Equals(Object, Object)进行比较时,返回False d1和d2?
来自http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx:
例如,考虑两个表示数字1.10和1.1000的Decimal对象.Decimal对象没有按位相等,因为它们具有不同的二进制表示以说明不同数量的尾随零.
感谢名单
@@ Rowcount用于通知最后一个select,insert,update或delete语句受影响的行数
Run Code Online (Sandbox Code Playgroud)declare @row int select 100 if @@rowcount>0 set @row=@@rowcount ...以上将返回0,因为一旦
if @@rowcount>0执行它将重置为0,因为它不返回任何行.所以总是先分配给变量
为什么语句if @@rowcount>0重置@@rowcount为0?是否 @@rowcount仅受select,insert,update和delete语句的影响?
谢谢
以下问题假设我们在WAS中与Asp.Net并行托管WCF服务:
"当与Asp.Net并行托管WCF时 - WCF托管基础架构在引发PostAuthenticateRequest事件时拦截WCF请求,并且不会将处理返回到ASP.NET HTTP管道.编码为在后续阶段拦截请求的模块管道不拦截WCF请求."
"通过并行配置,WCF托管基础架构拦截WCF消息并将它们路由出HTTP管道"
a)假设WAS收到WCF服务请求,是否会在引发事件时调用WCF的身份验证机制(Windows,MembershipProvider或自定义身份验证)PostAuthenticateRequest,或者只有在将请求路由到HTTP管道之后,WCF才会对请求进行身份验证?换句话说,WCF的身份验证机制是否在IIS的处理管道之外工作?
b)如果WCF的身份验证机制在IIS处理管道之外工作,那么我假设FormsAuthenticationModule不涉及验证WCF客户端(假设服务正在使用表单身份验证)?
c)另外,如果WCF的身份验证机制在IIS处理管道之外工作,那么我假设IIS/WAS必须配置为匿名身份验证,即使服务是使用Windows身份验证的身份验证客户端?
d)如果WCF服务由IIS7托管,那么上述问题的答案会有所不同(除了服务必须只使用通过HTTP协议通信的端点这一事实)?
谢谢
Int32struct没有为==运算符定义运算符重载方法,那么为什么代码不会导致编译时错误:
if(1 == null) ... ;
Run Code Online (Sandbox Code Playgroud) 1)
into keyword创建临时标识符,用于存储join,group或select子句的结果.
我假设into关键字只能用作group,join或select子句的一部分?
2)
a)我已经读过,当into用作group或select子句的一部分时,它将查询拼接成两半,并且由于在查询的前半部分声明的范围变量ALWAYS超出范围的下半部分查询.正确?
b)但是当when into作为join子句的一部分使用时,rangle变量永远不会超出查询范围(除非查询也包含group...into或select...into).我假设这是因为into在与join子句一起使用时没有将查询拼接成两半?
c)一个查询表达式包括一个从子句随后可选的查询体(从,其中,让条款),并且必须以结束选择的组子句.
d)如果into确实将拼接查询分为两半,则在下面的示例中,group子句是正文的一部分:
var result = from c1 in a1
group c1 by c1.name into GroupResult
select ...
Run Code Online (Sandbox Code Playgroud)
谢谢
回复Ufuk:
一个)
经过一组你得到一个像这个IEnumerable>的序列
没有一个 GroupBy运营商返回类型的结果IEnumerable<IGrouping<Key,Foo>>,而不是IEnumerable<Key,IEnumerable<Foo>>
b)我们不能认为group...by...into或者join...into拼接查询,因为查询的前半部分至少在概念上必须在查询的后半部分运行之前运行?
回复Robotsushi:
我越是想到它,我越觉得我的问题毫无意义,因为它没有任何实际价值.仍然...
当你说它被分裂.你的意思是变量的范围被拆分或生成的sql查询被拆分
这是引用:
在许多情况下,该除法一侧的范围变量不能与另一侧的范围变量混合.作为此分组子句的一部分的into关键字用于链接或拼接此查询的两半.因此,它标记了查询中间的边界,范围变量通常无法攀升.into关键字上方的范围变量超出了此查询的最后部分的范围. …
我创建了以下POCO类也取得了Contact.FirstName和Contact.LastName私有属性(这些属性被映射到实体框架模型,相应的属性).
public class Contact
{
public int ContactID { get; set; }
private string FirstName { get; set; }
public string LastName { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
我期望得到一个例外,因为EF无法为这两个属性赋值,但不知何故EF仍设法为它们赋值.这怎么可能,因为只有Contact类中的代码才能访问私有属性?
谢谢
int[] ids1 = { 1, 2, 3 };
int[] ids2 = { 1, 5, 6 };
var result = from a in ids1
where a == ids2.First()
select a;
foreach (var item in result) ; //ok
var employees = from c in context.Employees.
where c.EmployeeID == ids1.First()
select c;
foreach (var item in employees); // NotSupportedException
Run Code Online (Sandbox Code Playgroud)
当尝试ids1.First在Linq-to-Entities查询中调用时,我得到一个异常
System.NotSupportedException:方法'First'只能用作最终查询操作.请考虑在此实例中使用方法"FirstOrDefault".
a)我不明白为什么First只能用作最终查询操作,因为在我们的例子First中调用on IEnumerable<>(ids1.First())而不是on IQueryable<>.换句话说,First在Linq-to-Objects查询中调用而不是在Linq-to-Entities查询中调用?!
b)无论如何,为什么必须First用作最终查询操作,而FirstOrDefault不必进行最终查询操作?
谢谢 …
参数数组允许将可变数量的参数传递给方法:
static void Method(params int[] array)
{}
Run Code Online (Sandbox Code Playgroud)
但我没有看到它们的用处,因为通过指定特定数组类型的参数可以实现相同的结果:
static void Method(int[] array)
{}
Run Code Online (Sandbox Code Playgroud)
那么参数数组有什么好处(如果有的话)有数组类型的值参数?
谢谢