Linq到具有引用属性的实体

时间:2013-10-02 10:11:50

标签: c# .net linq entity-framework

我正在使用EF 5.0进行主数据管理的应用程序,我希望尽可能保持通用,因为加载项目,保存它们等总是一样的。

我的实体看起来像这样:

// IDBEntity.cs
public interface IDBEntity<T>
{
    public int ID { get; }

    ...
}

// Product.cs (Generated)
public class Product
{
    public int ProductID
    {
        get; set;
    }

    public string Name
    {
        get; set;
    }
}

// ProductExtension.cs
public patial class Product : IDBEntity<Product>
{
    public int ID
    {
        get
        {
            return ProductID
        }
    }
}

现在我想在某些情况下对ID进行查询,但问题是您无法使用自定义属性执行LINQ to Entity查询。

public class MasterDataViewModel<T> :  where T : IDBEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            // This is the problem
            CurrentItem = context.Set<T>.FirstOrDefault(x => x.ID == id)
        }
    }
}

是否可以使用指向真实ID的表达式来执行此操作?像这样:

public interface IDBEntity<T>
{
    public Expression<Func<T, int>> { get; }
}

public patial class Product : IDBEntity<Product>
{
    public Expression<Func<Product, int>> ID
    {
        get
        {
            return x => x.ProductID
        }
    }
}

这个问题还有其他更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

在同样的情况下,我们使用了这段代码:

public class BaseEntity
{
    public int Id { get; set; }
}

所以你的Product看起来像

public class Product : BaseEntity
{    
    public string Name { get; set; }
}

MasterDataViewModel

public class MasterDataViewModel<T> :  where T : BaseEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            CurrentItem = context.Set<T>.FirstOrDefault(x => x.Id == id)
        }
    }
}

答案 1 :(得分:1)

使用DbSet中的Find方法

public class MasterDataViewModel<T> :  where T : IDBEntity, new()
{
    public T CurrentItem { get; set; }

    public void ReloadItem(int id)
    {
        using (var context = new DatabaseContext())
        {
            CurrentItem = context.Set<T>().Find(id);
        }
    }
}