小编Mik*_*ike的帖子

为什么Contains()运算符会如此显着地降低Entity Framework的性能?

更新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)

c# sql performance contains entity-framework-4

79
推荐指数
5
解决办法
4万
查看次数

如何在Razor助手中使用UrlHelper?

我正在尝试创建一个像这样的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的最简洁方法是什么?我应该新推出内联吗?

asp.net-mvc helper razor

23
推荐指数
2
解决办法
2万
查看次数

在C#中,为什么dictionary [0] ++有效?

考虑以下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,所以索引器肯定没有返回引用.

有谁知道为什么我们看到这种行为?

.net c# dictionary

20
推荐指数
2
解决办法
2024
查看次数

我在哪里可以下载Visual Studio 2012 Report Viewer Runtime?

现在Visual Studio 2012已经发布,我在哪里可以下载随附的2012 Report Viewer Runtime,以便我可以在我的服务器上安装它?Visual Studio 2012中是否包含可再发行的安装程序?

具体来说,我正在寻找更新的2012版本:Microsoft Report Viewer 2010 Redistributable Package

reporting-services visual-studio-2012

17
推荐指数
2
解决办法
7万
查看次数

在实体框架中,为什么延迟加载不适用于一对一或一个导航属性?

考虑PersonAddress定义为的类

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

16
推荐指数
1
解决办法
5713
查看次数

如何在TortoiseHg 2.x中折叠补丁(qfold)?

我已经看过一些关于qfold的教程以及如何在TortoiseHg 1.x中做到这一点,但我无法弄清楚折叠补丁的按钮在2.x中的位置.在官方文件中没有提到它.有谁知道怎么做?

mercurial tortoisehg mercurial-queue

14
推荐指数
1
解决办法
2340
查看次数

如何在Web API中捕获SerializationException?

我有一个ASP.NET Web API Web服务,在某些情况下会抛出SerializationException.问题是我无法捕获并记录服务器端的这个异常 - 它显示的唯一地方是在客户端的HTTP响应正文中.

在ASP.NET Web APIExceptionFilterAttribute中的异常处理中注册了一个,并在我在控制器中抛出异常时验证它是否正常工作.不幸的是,在响应期间(控制器之后)抛出了SerializationException,并且似乎被ASP.NET完全吞没了.我也试过Application_Error()在Global.asax.cs中挂钩,但它也没有出现在那里.

如何在Web API响应期间捕获SerializationException异常?

asp.net serialization exception-handling asp.net-web-api

10
推荐指数
1
解决办法
2383
查看次数

为什么Global.asax.cs中的Session_Start会导致性能问题?

当我在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),那么它似乎没问题.所以,也许这不是一个重大问题,但它仍然很奇怪.

asp.net global-asax

9
推荐指数
1
解决办法
2万
查看次数

StringLengthAttribute似乎不起作用

这是我的带有数据注释的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并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?

validation ria data-annotations

9
推荐指数
1
解决办法
3988
查看次数

为什么在EventSource的子类上实现接口会在运行时抛出异常?

我试图通过.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如果它只是实现一个接口,为什么我的子类会中断呢?

这是一篇相关的帖子.

etw .net-4.5 perfview etw-eventsource

8
推荐指数
2
解决办法
2038
查看次数