Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 原因:LINQ to实体无法识别该方法?_C#_Linq_Linq To Sql - Fatal编程技术网

C# 原因:LINQ to实体无法识别该方法?

C# 原因:LINQ to实体无法识别该方法?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有两段代码,它们似乎具有相同的功能,但其中一段导致异常,而另一段则像一个符咒一样工作。我想知道你能想象为什么会这样吗 我的web应用程序中有以下行导致此异常: LINQ to实体无法识别方法“System.Object” FilterDeliveryAddressFields(WebApplication1.Models.DeliveryAddress)' 这是过滤器DeliveryAddressFields: private dynamic filterDeliveryAddressFiel

我有两段代码,它们似乎具有相同的功能,但其中一段导致异常,而另一段则像一个符咒一样工作。我想知道你能想象为什么会这样吗

我的web应用程序中有以下行导致此异常:

LINQ to实体无法识别方法“System.Object” FilterDeliveryAddressFields(WebApplication1.Models.DeliveryAddress)'

这是
过滤器DeliveryAddressFields

private dynamic filterDeliveryAddressFields(DeliveryAddress address)
{
    return new { address.address, address.deliverTo, address.deliverToPhoneNumber, address.id };
}
下面是为
DeliveryAddress
生成的Linq-2-Sql模型,该模型与
订户具有外键关系:

public partial class DeliveryAddress
{
    public int id { get; set; }
    public int fkSubscriberId { get; set; }
    public string address { get; set; }
    public string deliverTo { get; set; }
    public string deliverToPhoneNumber { get; set; }

    public virtual Subscriber Subscriber { get; set; }
}
但是,当我将db.DeliveryAddress
项更改为先列出,然后按如下方式再次运行代码时,一切正常,不再发生异常。我想知道第一个代码段有什么问题,而在下面的代码段中没有发生

List<DeliveryAddress> addresseList = db.DeliveryAddress.ToList(); //magic trick?!
dynamic deliveryAddresses =
    (from address in addresseList
     select filterDeliveryAddressFields(address)).ToList();
List addresseList=db.DeliveryAddress.ToList()//魔术?!
动态交付地址=
(来自地址列表中的地址)
选择filterDeliveryAddressFields(address)).ToList();

实际上,您的方法无法转换为t-SQL,Linq to Entities无法识别每个方法,您正在寻找的
.ToList()
方法背后的神奇之处在于,加载数据后,任何进一步的操作(如
选择
)都会使用Linq to对象对内存中已有的数据执行

但是,这种方法不能保证性能,因为您必须加载
您的数据存储在内存中,因此假设您的数据库中有大量数据,接下来会发生什么?

同意@Salah。在LINQtoEntities中,它首先尝试将查询转换为命令树,并针对ORM执行。请阅读您可以找到更多的细节

在第一种方法中,Linq尝试将
filterDeliveryAddressFields(address))
方法转换为命令树。这就是为什么它抱怨
LINQ to Entities无法识别该方法的原因

在第二种方法中,执行list或
IEnumerable
,这意味着使用LINQ来创建对象。你可以阅读更多关于它的内容

对于第一个解决方案,您可以尝试另一个实现。只需尝试使用聚合方法来过滤结果。然后您不需要
filterDeliveryAddressFields(address))
方法。你可以找到例子

类似这样的东西,(对不起,我没有亲自尝试。这只是为了让你有个想法。)


您对在内存中加载所有内容的关注是正确的,但是在这个特定的案例中,我最终不得不加载内存中的所有内容,因为它们在RESTWeb服务的输出中作为JSON返回。此外,作为一名伊朗人,我很高兴能从伊朗专家那里得到答案。干杯
List<DeliveryAddress> addresseList = db.DeliveryAddress.ToList(); //magic trick?!
dynamic deliveryAddresses =
    (from address in addresseList
     select filterDeliveryAddressFields(address)).ToList();
from address in db.DeliveryAddress
select new { address.address, address.deliverTo, address.deliverToPhoneNumber, address.id };