Linq查询&仿制药

时间:2013-12-13 10:29:31

标签: c# sql linq generics

我有大约3个班级,AuthorBook& Library。我有以下函数,它使用泛型来查询数据库中的所有记录:

public static System.ComponentModel.BindingList<T> getRecordsOfType<T>() where T : class, IEntity
{
    var records = session.Query.All<T>();
    return new System.ComponentModel.BindingList<T>(records.ToList<T>());
}

这很好用,现在我的后续函数应该使用其Id:

获取一条记录
public static System.ComponentModel.BindingList<T> getRecordOfTypeById<T>(int intId) where T : class, IEntity
{
    var record = session.Query.All<T>().Where(p => p.Id == intId);
    return new System.ComponentModel.BindingList<T>(record.ToList<T>());
}

这里C#不知道p将具有属性Id(我的所有类都将使用此函数)因为我正在使用泛型。

当然,我可以遍历库,书和作者,并为每个编写不同的查询,但如果我想扩展,我将在此函数中编写额外的代码。

这可以使用Linq解决,还是我需要解决这个问题?

1 个答案:

答案 0 :(得分:2)

IEntity应该包含名为Id的属性,它可以工作,或者你可以为其他人创建IHaveId接口。

public static System.ComponentModel.BindingList<T> 
              getRecordOfTypeById<T>(int intId) where T : class, IEntity, IHaveId

和界面如:

public interface IHaveId
{
    int Id { get; set;}
}

此方法中使用的所有实体都应实现IHaveId接口

如果您执行上述所有操作,则可确保p具有Id,并且您将能够在通用方法中使用它。