【问题标题】:Retrieve single Entity Framework entities using a LINQ query or GetObjectKey?使用 LINQ 查询或 GetObjectKey 检索单个实体框架实体?
【发布时间】:2009-06-26 15:44:02
【问题描述】:

看起来 GetObjectKey 的好处是搜索现有的实例化对象,然后搜索数据存储。但是,您似乎也失去了一些强类型,并且需要转换结果对象:

获取对象键

int customerID = 1;
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID);
Customer customer = context.GetObjectByKey(key) as Customer;

对比LINQ

int customerID = 1;
Customer customer = (from c in context.Customers 
                     where c.CustomerID = customerID
                     select c).FirstOrDefault();

就个人而言,我更喜欢后一种方法,因为打字。此外,您的 DAL 将相当统一,所有 Get 方法都是查询,尽管这只是个人喜好。

你们男孩女孩都用什么?

【问题讨论】:

  • 在前一种方法中,我会使用“as”关键字而不是强制转换。这样,如果结果为 null,则不会引发异常。 as 关键字尝试强制转换值,但如果它不是正确的类型,它会给你 null 。所以你会有 context.GetObjectByKey(key) as Customer;.
  • 好点。我将修改示例以使分数更均匀。

标签: c# asp.net linq entity-framework


【解决方案1】:

我更喜欢后者,因为它很清楚你想要什么。通过使用 EntityKey(这是 ADO.NET 团队似乎不理解的东西),我们必须解决 Entity Framework 强加给我们的结构。通过以您在第二个示例中所做的方式使用查询语言,我们告诉所有其他将查看我们的代码的开发人员,嘿,我们只想要具有此 ID 的对象,或者我们想要 null。

我不认为正确(就像您在第一个示例中一样)是您的同事不清楚的借口。 :)

【讨论】:

    【解决方案2】:

    在我的解决方案中,我使用通用编程。在基础 Repository 类中,我有这样的代码:

    private string GetEnittySetName(string entityTypeName)
    {
        var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
        string entitySetName = (from meta in container.BaseEntitySets
                                where meta.ElementType.Name == entityTypeName
                                select meta.Name).FirstOrDefault();
        return entitySetName;
    }
    
    private string entitySetName;
    
    protected string EntitySetName
    {
        get
        {
            if (string.IsNullOrEmpty(entitySetName))
            {
                entitySetName = GetEnittySetName(typeof(T).Name);
            }
            return entitySetName;
        }
    }
    
    public T SelectOne(Func<T, bool> exp)
    {
        return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多