理论上我有两个类似的查询返回相同的结果:
var requestNotWorking = SessionManagement.Db.Linq<Item>(false).Where(i =>
i.Group != null && i.Group.Id == methodParameter)
.ToList();
Run Code Online (Sandbox Code Playgroud)
此请求返回0项,即使它应该返回一项.以下是对后者的重写,但是调用了该ToList()方法.此请求有效并返回第一个查询中预期的项目!
var requestWorking = SessionManagement.Db.Linq<Item>(false).ToList().Where(i =>
i.Group != null && i.Group.Id == methodParameter).ToList();
Run Code Online (Sandbox Code Playgroud)
注意:SessionManagement.Db.Linq<Item>(false)是一个通用的Linq到Nhibernate方法,其布尔属性确定请求是否必须在缓存(true)或数据库(false)中执行.这种方法应该没有错,因为它在解决方案的许多其他部分正常工作.Item的映射没什么特别之处:没有包包和以下参数:
lazy="false" schema="dbo" mutable="false" polymorphism="explicit"
为什么会这样?
编辑:
生成的requestNoWorking的sql请求以:
(Item.Group_ID is not null) and Item.Group_ID=@p0',N'@p0 int',@p0=11768
生成的requestWorking的sql请求大致是一个 select * from dbo.Items
我发现了以下我很难理解的行为.
我假设您可以将对象A的属性设置为对象B,操纵对象B并且更改将被传递到对象A的属性(因为它是同一个对象).我期待这个单元测试通过但是在将B设置为null时它在最后一行失败.为什么?
[TestMethod]
public void TestObject()
{
Child child = new Child();
var parent = new Parent(child);
child.Name = "John";
Assert.AreEqual(parent.Child.Name, "John");
child = null;
Assert.IsNull(parent.Child);
}
public class Child
{
public string Name { get; set; }
}
public class Parent
{
public Child Child { get; set; }
public Parent(Child kid)
{
Child = kid;
}
}
Run Code Online (Sandbox Code Playgroud) 我在浏览遗留代码时刚刚遇到这样的块:
object exeName = _connectionSettings.ApplicationName.Clone();
RandomFunction(exeName);
Run Code Online (Sandbox Code Playgroud)
起初这对我来说似乎没什么用,但它让我感到好奇。两者之间是否存在根本区别:
var copiedString = initialString;
var copiedString = initialString.Clone();
var copiedString = string.Copy(initialString);
Run Code Online (Sandbox Code Playgroud)
我创建了一个基本的单元测试,似乎表明没有,因为无论使用什么方法,它的行为方式都是相同的(复制字符串的初始影响、初始字符串的更改、复制字符串值的断言)。我错过了什么吗?