gpt4 book ai didi

c# - 按 Entity Framework 中的自定义实体属性排序

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:27 24 4
gpt4 key购买 nike

关于 Entity Framework 实体中自定义扩展属性的另一个问题。

实体模型一般来说非常简单。当然在现实中它更复杂,但只是为了简单起见,我没有粘贴所有生成的代码,只是粘贴类和所需的属性。所以,我有实体类:

partial class Calibration
{
public string Identifier {get;set;}
public Device CalibratedDevice {get;set;}
}

partial class Device
{
public string Name {get;set;}
public ModelGroup ModelGroup {get;set;}
}

partial class ModelGroup
{
public Model[] Models {get;set;}
}

partial class Model
{
public Name {get;set;}
}

我需要在另一个文件中使用额外的计算属性来扩展校准类。

partial class Calibration
{
public string ModelGroupName {get;set;}
}

这个属性是这样计算的:

string.Join(" / ", CalibratedDevice.ModelGroup.Models.Select(m => m.Name));

最后,我需要根据计算得出的属性对校准实体的 ObjectSet 进行排序。当然,像这样的代码

Calibrations.OrderBy(c => c.ModelGroupName) 

不会抛出异常,因为 EF 无法将 ModelGroupName 属性转换为数据库。当然,我知道最简单的方法:

Calibrations.AsEnumerable().OrderBy(c => c.ModelGroupName) 

当然,它对我不起作用,我不想从数据存储中加载所有对象并在 linq 中对它们进行排序,因为我只需要整个命令中的一小部分 对象集。

我知道存储计算 lambda 而不是属性并将其传递给 OrderBy 方法的方法,但它也不起作用,因为我的计算逻辑比简单的 a + b 更复杂。例如

partial class Calibration
{
public static Expression<Func<Calibration, string>> ModelGroupName
{
get
{
return c => string.Join(" / ", c.CalibratedDevice.ModelGroup.Models.Select(m => m.Name));
}
}
}

Calibrations.OrderBy(Calibration.ModelGroupName)

将抛出异常,因为 EF 无法将 string.Join 方法添加到数据库。我使用的是 EF 的第一个版本,这种烦人的方法转换机制是一场灾难。现在经过几年的 EF 发展,这个问题已经存在,我可以找到任何合适的解决方案。

因此,请建议使用自定义属性组织 IQueryable EF 排序的方法,其中计算逻辑不会直接转换为 SQL。感谢您的回复。

最佳答案

您可以将 SQL 函数映射到 Entity Framework 中的 CLR 函数。
这是有关如何完成的教程:
http://blogs.microsoft.co.il/blogs/gilf/archive/2009/05/28/entity-sql-user-defined-functions-in-entity-framework-4.aspx

如果您需要进一步的帮助,请告诉我。

关于c# - 按 Entity Framework 中的自定义实体属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7967590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com