gpt4 book ai didi

entity-framework - Entity Framework 、LINQ 和泛型

转载 作者:行者123 更新时间:2023-12-04 06:25:34 25 4
gpt4 key购买 nike

我有以下代码:

public interface IKeyed<TKey>
{
TKey Id { get; }
}

// This is the entity framework generated model. I have added the
// IKeyed<Guid> interface
public partial class Person : IKeyed<Guid>
{
public Guid Id { get; set; }
}

public class Repository<TKey, TEntity> : IKeyedRepository<TKey, TEntity>
where TEntity : class, IKeyed<TKey>
{
private readonly IObjectSet<TEntity> _objectSet;

public Repository(IOjectSet<TEntity> objectSet)
{
_objectSet = objectSet;
}

public TEntity FindBy(TKey id)
{
return _objectSet.FirstOrDefault(x => x.Id.Equals(id));
}
}

[更新]
我是这样称呼它的:
Db2Entities context = new Db2Entities(_connectionString); // This is the EF context
IObjectSet<Person> objectSet = context.CreateObjectSet<Person>();

IKeyedRepository<Guid, Person> repo = new Repository<Guid, Person>(objectSet);

Guid id = Guid.NewGuid();
Person person = repo.FindBy(id); // This throws the exception.

上面的代码编译。执行“FindBy”方法时,出现以下错误:

无法创建“闭包类型”类型的常量值。此上下文仅支持原始类型(例如 Int32、String 和 Guid)。

由于我的“Id”类型是 Guid(支持的原始类型之一),因此我似乎应该能够将其按摩到工作中。

有谁知道这是否可能?

谢谢,

鲍勃

最佳答案

这种方式行不通。您不能调用 Equals因为 EF 不知道如何将其转换为 SQL。当您将表达式传递给 FirstOrDefault它必须始终只有可以翻译成 SQL 的代码。通过手动构建表达式树可能可以解决您的问题,但我可以引用 Stack Overflow 上已经讨论过的其他解决方案。
ObjectContext提供名为 GetObjectByKey 的方法这正是你想要做的。问题是它需要 EntityKey作为参数。这里有两个答案,展示了如何使用此方法以及如何获取 EntityKey :

  • Entity Framework Simple Generic GetByID but has differents PK Name
  • generic GetById for complex PK

  • 在您的情况下,代码将不那么复杂,因为您知道关键属性的名称,因此您通常只需要这样的内容:
    public virtual TEntity FindBy(TKey id)
    {
    // Build entity key
    var entityKey = new EntityKey(_entitySetName, "Id", key);
    // Query first current state manager and if entity is not found query database!!!
    return (TEntity)Context.GetObjectByKey(entityKey);
    }

    这里的问题是你不能得到 entitySetName来自 IObjectSet因此您必须将其传递给存储库构造函数,或者您必须传递 ObjectSet .

    以防万一您将来想要使用 DbContext API (EFv4.1) 而不是 ObjectContext API,它将大大简化,因为 DbSet报价 Find方法:
  • generic repository EF4 CTP5 getById
  • 关于entity-framework - Entity Framework 、LINQ 和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077353/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com