没有lambda表达式的实体框架查询

Joh*_*ell 2 c# generics lambda entity-framework

所以我正在写一个"半通用"类,它与签名一遍又一遍地适合相同的模式

public class BaseSupportRepo<TEntity, TDto> where TEntity : class where TDto : class
Run Code Online (Sandbox Code Playgroud)

所有使用此类的repos都有一个属性 Name

我想要做的是编写一个函数,如果名称匹配某些输入(但名称不是主键),将返回.Single().

现在,如果这是一个非泛型函数,那么它很容易

.Single(g => g.Name == name)
Run Code Online (Sandbox Code Playgroud)

但是因为这是一个泛型函数,所以无法使用.Name属性,因为TEntity可能没有任何属性Name.

EF中是否有任何功能可以允许类似于: -

.Single(string key, string value)
Run Code Online (Sandbox Code Playgroud)

这将允许我绕过这个要求.

Grz*_*z W 5

创建界面:

public interface IEntityWithName
{
    string Name { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

并将您的回购改为:

public class BaseSupportRepo<TEntity, TDto> where TEntity : class, IEntityWithName 
                                            where TDto : class
Run Code Online (Sandbox Code Playgroud)

如果您使用edmx文件生成了代码,则可以更改生成您的类的T4模板以实现IEntityWithName或创建如下所示的部分类:

public partial class SomeEntity : IEntityWithName
{
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写可以使用的查询 Name

  • 如果实体是部分类,则可以将接口放在自己文件的部分类中 (2认同)