C# 使用LINQ查询或GetObjectKey检索单个实体框架实体?

C# 使用LINQ查询或GetObjectKey检索单个实体框架实体?,c#,asp.net,linq,entity-framework,C#,Asp.net,Linq,Entity Framework,看起来GetObjectKey的优点是搜索现有的实例化对象,然后搜索数据存储。但是,您似乎也丢失了一些强类型,需要强制转换生成的对象: GetObjectKey int customerID = 1; EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID); Customer customer = context.GetObjectByKey(key) as Customer; 林克对战 i

看起来GetObjectKey的优点是搜索现有的实例化对象,然后搜索数据存储。但是,您似乎也丢失了一些强类型,需要强制转换生成的对象:

GetObjectKey

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

int customerID = 1;
Customer customer = (from c in context.Customers 
                     where c.CustomerID = customerID
                     select c).FirstOrDefault();
就我个人而言,我更喜欢后一种方法,因为它需要打字。此外,您的DAL将相当统一,所有Get方法都是查询,尽管这只是个人偏好


你们男孩和女孩用什么?

我更喜欢后者,因为它清楚地表明了你们想要什么。通过使用EntityKey(ADO.NET团队似乎不理解这一点),我们必须绕过实体框架强加给我们的结构。通过使用第二个示例中使用的查询语言,我们告诉所有其他将查看我们代码的开发人员,嘿,我们只希望这个对象具有此ID,或者我们希望为null


我不认为正确(正如你在第一个例子中一样)是同事不清楚的借口

在我的解决方案中,我使用泛型编程。在基本存储库类中,我有如下代码:

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();
}
私有字符串GetEnittySetName(字符串entityTypeName)
{
var container=context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName,DataSpace.CSpace);
字符串entitySetName=(来自container.BaseEntitySets中的meta)
其中meta.ElementType.Name==entityTypeName
选择meta.Name).FirstOrDefault();
返回entitySetName;
}
私有字符串entitySetName;
受保护字符串EntitySetName
{
得到
{
if(string.IsNullOrEmpty(entitySetName))
{
entitySetName=GetEntitySetName(typeof(T).Name);
}
返回entitySetName;
}
}
公共T-SelectOne(功能扩展)
{
返回context.CreateQuery(EntitySetName).Where(exp).FirstOrDefault();
}

在前一种方法中,我会使用“as”关键字而不是cast。这样,如果结果为null,则不会引发异常。as关键字尝试强制转换该值,但如果该值的类型不正确,则会改为null。因此,您将context.GetObjectByKey(key)作为Customer;。说得好。我将对示例进行修改,使分数稍微相等。