最近我遇到了这个问题,我花了一些时间才弄明白。我有这样一段代码:
private Member FindMemberByName(string name)
{
var member =
this.db.Members.AsEnumerable()
.Where(d => d.ShortName == name)
.DefaultIfEmpty(this.CreateNewMember(name))
.First();
return member;
}
private Member CreateNewMember(string name)
{
return this.db.Members.Add(new Member { Name = name });
}我期望FindMemberByName()返回现有的实体,如果不存在,则创建新的实体并返回一个实体。
但是,我注意到,即使传递了现有名称,也会调用CreateNewMember()。
发布于 2016-03-20 03:57:27
您询问的行为与LINQ无关。您放在DefaultIfEmpty()参数列表中的方法将在调用DefaultIfEmpty()之前进行计算。您可以通过编写一个类似的方法来查看这一点,该方法不引用传入的默认对象。
void Main()
{
CalledMethod(CreateDefault("Hello World"));
}
void CalledMethod<TSource>(TSource defaultValue)
{
}
TestClass CreateDefault(string message)
{
return new TestClass() { Message = message, };
}
public class TestClass
{
public string Message { get; set; } = null;
public TestClass() { }
}发布于 2016-03-20 03:09:40
经过一些调试,我已经理解了即使没有调用任何DefaultIfEmpty()方法,也会立即计算First()参数的值。因此,实际上,在了解结果IEnumerable是否为空之前,会对其进行计算。
我花了几个小时试图弄清楚这个问题。希望这能帮助其他人节省同样多的时间:-)
https://stackoverflow.com/questions/36105952
复制相似问题