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

asp.net c# entity-framework linq

看起来GetObjectKey具有搜索现有的实例化对象以及数据存储的好处。但是,它似乎也失去了一些强类型,并且需要转换生成的对象:

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方法都是查询,尽管这只是个人偏好。

你们男孩和女孩用的是什么?

一般承认的答案

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

我不认为这是正确的(正如你在第一个例子中所说的那样)是一个不向同事说清楚的借口。 :)


热门答案

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


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因