linq - 如何使用 EF Code First 表示期权计算列?

标签 linq entity-framework entity-framework-4 code-first ef-code-first

我有一个情况,我有一个我将查询的条目表,但在某些情况下,我会有额外的可用信息。

例如,如果我有一张 people 表,我希望能够按名称搜索,但我也想存储一些坐标并根据他们的位置进行搜索,但也公开了对象模型中的距离。因此,例如,假设我的 people 表看起来像这样:

PersonId int
Name nvarchar(100)
Address nvarchar(100)
Latitude float(10,6)
Longitude float(10,6)

实体类定义如下:

public class Person
{
     public int PersonId { get; set; }
     public sting Name { get; set; }
     public float Latitude { get; set; }
     public float Longitude { get; set; }
}

然后我可以很容易地通过名字找到一个人:

var people = from p in myDb.People where p.Name.Contains("joe");

现在,我创建了名为 CalculateDistance 的用户定义函数来处理此距离计算。所以我的 SQL 看起来像这样:

String sql = "SELECT *, dbo.CalculateDistance(" + location.X + ", " + location.Y + ", Latitude, Longitude) AS Distance FROM people ORDER BY Distance

我如何在代码中表示它?我试过将这样的属性添加到类中:

public virtual float Distance { get; set; }

但是名称查询失败,因为没有距离列。我还尝试扩展 Person 类:

public class PersonWithDistance: Person {
    public float Distance { get; set; }
}

但这导致了映射生成方式的更多问题。

实现这样的东西的正确方法是什么?我是否必须为距离查询的结果创建一个完全独立的类?

最佳答案

这不是很好的设计。您应该将距离作为 Person 或某些辅助类的方法,并在您的应用程序中而不是在数据库中计算距离。它还需要将位置转移给该人。

无论如何,如果您想添加一些未映射到数据库列的属性,您必须将其排除在映射之外。这可以通过属性来完成:

[NotMapped]
public float Distance { get; set; }

或通过 Fluent API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Person>().Ignore(p => p.Distance);
}

关于linq - 如何使用 EF Code First 表示期权计算列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5302293/

相关文章:

c# - 使用 Rx( react 性扩展)观察 ObservableCollection 中的特定项目

c# - Linq to Sql 联合语句

c# - Linq 没有显示正确的数字

c# - Excel工作表用c#选择第一行

entity-framework - 如何配置我的 DbSet 以映射到特定 SqlServer 架构中的特定表?

entity-framework - EF 4.1 Fluent Code First 的按类型继承

c# - 如何使用 Entity Framework 检索插入实体的 ID?

c# - 从 EntityFramework 调用存储过程时出错

c# - 使用 Unity/Prism/MVVM 的 ObjectContext 构造函数注入(inject)

.net - 如何在类库中定位EF生成的元文件?