我在MVC应用程序中使用LINQ。我注意到我可以通过两种方式创建一种方法,两种方法都有效,但我不知道哪种方法最好。
直接:
public string GetStatus(int PersonId)
{
return db.PersonStatus
.Where(x => x.personid == PersonId)
.Select(x => x.Status)
.Single();
}
在var中首先:
public string GetStatus(int PersonId)
{
string Item = db.PersonStatus
.Where(x => x.personid == PersonId)
.Select(x => x.Status)
.Single();
return Item;
}
我更喜欢第一种直接方法,因为它似乎更有效。如果两者之间存在显着差异,请告诉我,如果是,那该怎么办?
答案 0 :(得分:5)
据我所知,两个之间没有实际差异(第二个可能优化到第一个)。使用LINQ和常规函数执行此操作也没有区别。
但是,第二个将更容易调试,因为您在评估后将结果放在某处,因此您可以放入断点并检查该变量。不过,我发现第一个略显清晰。
这是两个功能:
int Foo(int a, int b)
{
int x = a+b;
return x;
}
int Bar(int a, int b)
{
return a+b;
}
这是通过优化产生的IL(根据LINQPad):
Foo:
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldarg.2
IL_0003: add
IL_0004: stloc.0 // x
IL_0005: ldloc.0 // x
IL_0006: stloc.1 // CS$1$0000
IL_0007: br.s IL_0009
IL_0009: ldloc.1 // CS$1$0000
IL_000A: ret
Bar:
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldarg.2
IL_0003: add
IL_0004: stloc.0 // CS$1$0000
IL_0005: br.s IL_0007
IL_0007: ldloc.0 // CS$1$0000
IL_0008: ret
您会注意到Foo
有两行,它声明变量然后读取它。
这里有优化:
Foo:
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: add
IL_0003: stloc.0 // x
IL_0004: ldloc.0 // x
IL_0005: ret
Bar:
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: add
IL_0003: ret
再次,一个额外的任务和负载。你永远不会注意到差异。
答案 1 :(得分:3)
没有区别(我想这会被优化下来,在执行时会完全相同)。
第一个选项更简洁,后者为您提供了一个明显的断点,如果您以后决定使用查询,则可以轻松插入更多代码。也就是说,在这种情况下加入它很容易。只要选择最适合你的东西。
答案 2 :(得分:0)
无显着差异。我更喜欢第一个,虽然如果你使用第二个,它可能更容易调试,所以你可以看到你要返回的内容。此外,如果您可能需要对返回的内容进行一些更改,您可能最终会转向第二种方式。
答案 3 :(得分:0)
没有区别。除非我正在调试并想观看结果,否则我更喜欢第一个。
如果函数返回IQueryable<T>
,请注意第一个选项,因为在调用函数迭代可查询之前,实际上不会对结果进行求值。如果您正在使用闭包和事物(运行时将尝试在它的上下文消失之后评估可查询的),这可能会导致奇怪的错误。