使用LINQ查询或GetObjectKey检索单个Entity Framework实体?

8

看起来GetObjectKey有一个好处,它可以搜索已经存在的实例化对象,然后再搜索数据存储。但是,似乎你会失去一些强类型,并且需要转换你的结果对象:

GetObjectKey

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

vs. 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;。 - Doctor Jones
好的,我会修改这个例子,稍微平衡一下。 - John B
2个回答

9

我更倾向于使用后者,因为它明确清晰地表达了你想要的内容。通过使用EntityKey(这是ADO.NET团队似乎不理解的东西),我们必须绕过Entity Framework强加给我们的结构。通过像第二个示例中所做的那样使用查询语言,我们告诉所有将来查看我们代码的开发人员,“嘿,我们只想要这个具有此ID或我们想要null的对象。”

我认为正确性(就像您在第一个示例中一样)并不是不向同事清晰表达的借口:)


1
在我的解决方案中,我使用了泛型编程。在基本的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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接