更新3:根据此公告,EF团队在EF6 alpha 2中已经解决了这个问题.
更新2:我已经创建了一个解决此问题的建议.要投票,请到这里.
考虑一个带有一个非常简单的表的SQL数据库.
CREATE TABLE Main (Id INT PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)
我用10,000条记录填充表格.
WITH Numbers AS
(
SELECT 1 AS Id
UNION ALL
SELECT Id + 1 AS Id FROM Numbers WHERE Id <= 10000
)
INSERT Main (Id)
SELECT Id FROM Numbers
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)
我为表构建EF模型并在LINQPad中运行以下查询(我使用"C#语句"模式,因此LINQPad不会自动创建转储).
var rows =
Main
.ToArray();
Run Code Online (Sandbox Code Playgroud)
执行时间约为0.07秒.现在我添加Contains运算符并重新运行查询.
var ids = Main.Select(a => a.Id).ToArray();
var rows =
Main
.Where (a => ids.Contains(a.Id))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
这种情况的执行时间是20.14秒(慢288倍)!
起初我怀疑为查询发出的T-SQL需要更长的时间才能执行,因此我尝试将其从LINQPad的SQL窗格剪切并粘贴到SQL Server Management Studio中.
SET …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个像这样的Razor助手:
@helper Render(IEnumerable<MyItem> items) {
<ul>
@foreach (var item in items) {
<li><a href="@Url.Content(item.Url)">Click</a></li>
}
</ul>
}
Run Code Online (Sandbox Code Playgroud)
这里唯一的问题是System.Web.WebPages.HelperPage(Razor助手的基类)没有Url属性(类型为UrlHelper).它有Html(类型为HtmlHelper)但没有Url.
在帮助者中获取UrlHelper的最简洁方法是什么?我应该新推出内联吗?
考虑以下C#代码:
var d = new Dictionary<int, int>();
d[0] = 0;
d[0]++;
Run Code Online (Sandbox Code Playgroud)
执行此代码后d [0]的值是多少?我希望d [0] == 0,因为Dictionary <>的Item属性返回一个值类型 int,可能在堆栈上,然后递增.然而,令人惊讶的是,当您实际运行此代码时,您会发现d [0] == 1.
上面的示例表现得好像索引器正在返回引用类型,但现在考虑以下内容:
var d = new Dictionary<int, int>();
d[0] = 0;
var a = d[0];
a++;
Run Code Online (Sandbox Code Playgroud)
执行此代码后d [0]的值是多少?这次我们按预期得到d [0] == 0,所以索引器肯定没有返回引用.
有谁知道为什么我们看到这种行为?
现在Visual Studio 2012已经发布,我在哪里可以下载随附的2012 Report Viewer Runtime,以便我可以在我的服务器上安装它?Visual Studio 2012中是否包含可再发行的安装程序?
具体来说,我正在寻找更新的2012版本:Microsoft Report Viewer 2010 Redistributable Package
考虑Person和Address定义为的类
class Person
{
public int PersonId { get; set; }
public virtual Address Address { get; set; }
}
class Address
{
public int PersonId { get; set; }
public virtual Person Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
只有一些人有一个地址,但所有地址都有一个人.这是一对一或零关系,因此我将其配置为
modelBuilder.Entity<Address>()
.HasKey(a => a.PersonId)
.HasRequired(a => a.Person)
.WithOptional(a => a.Address);
Run Code Online (Sandbox Code Playgroud)
现在,在我的代码中,以下方法(急切加载)完美地运行.
var person = context.Person
.Include(a => a.Address)
.Single(a => a.PersonId == 123);
var address = person.Address; // address != null (correct)
Run Code Online (Sandbox Code Playgroud)
但是,以下方法(延迟加载)不会.
var …Run Code Online (Sandbox Code Playgroud) entity-framework lazy-loading ef-code-first entity-framework-5 entity-framework-6
我已经看过一些关于qfold的教程以及如何在TortoiseHg 1.x中做到这一点,但我无法弄清楚折叠补丁的按钮在2.x中的位置.在官方文件中没有提到它.有谁知道怎么做?
我有一个ASP.NET Web API Web服务,在某些情况下会抛出SerializationException.问题是我无法捕获并记录服务器端的这个异常 - 它显示的唯一地方是在客户端的HTTP响应正文中.
我在ASP.NET Web APIExceptionFilterAttribute中的异常处理中注册了一个,并在我在控制器中抛出异常时验证它是否正常工作.不幸的是,在响应期间(控制器之后)抛出了SerializationException,并且似乎被ASP.NET完全吞没了.我也试过Application_Error()在Global.asax.cs中挂钩,但它也没有出现在那里.
如何在Web API响应期间捕获SerializationException异常?
当我在Global.asax.cs中创建一个空的Session_Start处理程序时,它会在向浏览器呈现页面时造成重大影响.
如何重现:
创建一个空的ASP.NET MVC 3 Web应用程序(我正在使用MVC 3 RC2).然后使用以下代码添加Home控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Number(int id)
{
return Content(id.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
接下来创建一个视图Home/Index.cshtml并将以下内容放在BODY部分中:
@for (int n = 0; n < 20; n++)
{
<iframe src="@Url.Content("~/Home/Number/" + n)" width=100 height=100 />
}
Run Code Online (Sandbox Code Playgroud)
当您运行此页面时,您将看到页面上出现20个IFRAME,每个IFRAME都有一个数字.我在这里所做的就是创建一个页面,在幕后加载20多页.在继续之前,请注意这20页加载的速度(刷新页面几次以重复加载).
接下来转到你的Global.asax.cs并添加这个方法(是的,方法体是空的):
protected void Session_Start()
{
}
Run Code Online (Sandbox Code Playgroud)
现在再次运行该页面.这次你会注意到20个IFRAME的加载速度要慢得多,一个接一个地大约相隔1秒.这很奇怪,因为我们实际上并没有在Session_Start中做任何事情......它只是一个空方法.但这似乎足以导致所有后续页面的减速.
有谁知道为什么会这样,更好的是有人有修复/解决方法吗?
更新
我发现只有在附加调试器(使用F5运行)时才会出现此行为.如果你在没有连接调试器的情况下运行它(Ctrl-F5),那么它似乎没问题.所以,也许这不是一个重大问题,但它仍然很奇怪.
这是我的带有数据注释的Test类:
class Test
{
[Required, StringLength(10)]
public string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制台测试程序:
class Program
{
static void Main(string[] args)
{
var test = new Test {
MyProperty = "this is way more than 10 characters and should fail."
};
var context = new ValidationContext(test, null, null);
// No exception here! (why not?)
Validator.ValidateObject(test, context);
test.MyProperty = null;
// Exception here, as expected
Validator.ValidateObject(test, context);
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当字符串长度太长时,我没有得到验证异常.当我将属性设置为null并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?
我试图通过.NET 4.5中包含的EventSource类在我的.NET应用程序中使用事件跟踪Windows(ETW).我继承的,并试图实现一个接口(用于嘲讽的目的),如下所示:EventSourceMyEventSourceIMyEventSource
public interface IMyEventSource
{
void Test();
}
public class MyEventSource : EventSource, IMyEventSource
{
public static MyEventSource Log = new MyEventSource();
[Event(1)]
public void Test()
{
this.WriteEvent(1);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行PerfView并执行此代码时,我IndexOutOfRangeException接到了一个电话WriteEvent.如果我通过修改代码删除界面...
public class MyEventSource : EventSource
{
public static MyEventSource Log = new MyEventSource();
[Event(1)]
public void Test()
{
this.WriteEvent(1);
}
}
Run Code Online (Sandbox Code Playgroud)
...然后一切正常.
以下是我在两种情况下用于测试的代码:
static void Main(string[] args)
{
MyEventSource.Log.Test();
}
Run Code Online (Sandbox Code Playgroud)
EventSource如果它只是实现一个接口,为什么我的子类会中断呢?
这是一篇相关的帖子.
asp.net ×2
c# ×2
.net ×1
.net-4.5 ×1
asp.net-mvc ×1
contains ×1
dictionary ×1
etw ×1
global-asax ×1
helper ×1
lazy-loading ×1
mercurial ×1
performance ×1
perfview ×1
razor ×1
ria ×1
sql ×1
tortoisehg ×1
validation ×1