首页 > 解决方案 > LINQ to Entities 在运行时更改实体

问题描述

我有个问题。我有一个 dbContext,它有 200 多个类,代表数据库中的所有表。所有表格都遵循相同的格式。是否可以通过以下方式在运行时动态更改代码?

var coffeeList = new ObservableCollection<GenericCoffeeList>();
var query = (from c in ctxCoin.Coffee1
             select new GenericCoffeeList { CoffeeCatalogId = c.Id, Name = c.Name, Type = c.Type })
             .ToList();

foreach (var c in query)
{
    coinList.Add(c);
}

这是下一个几乎相同的实体类型。唯一的变化是实体

var coffeeList = new ObservableCollection<GenericCoffeeList>();

var query = (from c in ctxCoin.Coffee2
             select new GenericCoffeeList { CoffeeCatalogId = c.Id, Name = c.Name, Type = c.Type })
             .ToList();

foreach (var c in query)
{
    coinList.Add(c);
}

有没有办法在运行时更改实体,或者我必须对每个实体进行编码?感谢您对这个问题的任何指导。

标签: c#linqdynamicentitydbcontext

解决方案


这应该工作:

var coffeeRepoList = new List<IQueryable<ICoffee>>()
{
    ctxCoin.Coffee1,
    ctxCoin.Coffee2,
    //...
    ctxCoin.CoffeeN,
};

var coffeeList = (
    from coffeeRepo in coffeeRepoList
    from coffee in coffeeRepo
    select new GenericCoffeeList
    {
        CoffeeCatalogId = coffee.Id,
        Name = coffee.Name,
        Type = coffee.Type
    }).ToList();

public interface ICoffee // make all your entities implement this
{
    int Id { get; set; }
    string Name { get; set; }
    string Type { get; set; }
}

public partial class Coffee1 : ICoffee { }
public partial class Coffee2 : ICoffee { }
//...
public partial class CoffeeN : ICoffee { }

您可以在数据库中运行此查询生成 coffeeRepoList:

"SELECT '    ctxCoin.' + name + ',' FROM sys.tables ORDER BY name"

它会生成这个:

    ctxCoin.Coffee1,
    ctxCoin.Coffee2,
    //...
    ctxCoin.CoffeeN,

或使用反射:

public static List<IQueryable<ICoffee>> GetCoffeeDbSets(DbContext ctxCoin)
{
    return (
        from property in ctxCoin.GetType().GetProperties()
        where typeof(IQueryable<ICoffee>).IsAssignableFrom(property.PropertyType)
        select (IQueryable<ICoffee>)property.GetValue(ctxCoin)).ToList();
}

要使您的所有实体实现该接口,您可以使用此查询:

"SELECT 'public partial class ' + name + ' : ICoffee { }' FROM sys.tables ORDER BY name"

它会生成这个:

public partial class Coffee1 : ICoffee { }
public partial class Coffee2 : ICoffee { }
//...
public partial class CoffeeN : ICoffee { }

推荐阅读