给我对象引用不设置为一个对象的实例.当将linqtoentites转换为linqtoobjects时

本文关键字:当将 linqtoentites 转换 linqtoobjects 实例 一个对象 对象引用 设置 | 更新日期: 2023-09-27 18:15:55

我是这样做的:

我班上

public class Order
{
  // remove some code for brevity
  public virtual Foo Foo { get; set; }
  public virtual Bar Bar { get; set; }
  public virtual ICollection<Knife> Knives { get; set; }
}

视图模型

更新:

public class OrderVm
{
  public string SomeText { get; set; }
}

in my controller

第一次尝试:这给了我Object reference not set to an instance of an object.

var tmp = _db.Orders
           .Include("Foo")
           .Include("Bar")
           .Include("Knives")
           .AsEnumerable()
           .Select(o => new OrderVm
           {
             SomeText = o.Knives.Count().ToString() + " some text here"
           });

第二次尝试:给出我错误LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

var tmp = _db.Orders
            .Include("Foo")
            .Include("Bar")
            .Include("Knives")
            .Select(o => new OrderVm
            {
              SomeText = o.Knives.Count().ToString() + " some text here"
            });

所以基本上,我需要的是在分配属性时执行.ToString()(需要从int转换为string)。他们说,通过调用AsEnumerable()(建议显示而不是ToList())将LinqToEntities转换为LinqToObjects,但是当我试图转换它时。这让我的Object reference not set to an instance of an object.真的不知道为什么。任何想法吗?

给我对象引用不设置为一个对象的实例.当将linqtoentites转换为linqtoobjects时

第二个片段不是在c#代码中执行投影,而是将该代码转换为在数据库端执行的SQL代码。与您正在执行的操作相当的SQL可以在null值上执行,并且只会传播null,而不会使查询崩溃。

第一个查询执行c#应用程序中的代码,使用c#操作和null处理行为,即当尝试调用null值的函数而不是传播null '时抛出异常。

如果您可以在数据库端执行投影,那么您可能应该这样做,因为它将防止您沿着网络向应用程序传递不必要的不需要的信息。如果你在c#端执行投影,你需要对其进行编码,使其能够正确处理null值而不会崩溃。

相关文章: