检查所有表格中同一列的值[实体框架]

问题描述 投票:1回答:1

我在数据库中有100多张表,其中有60多张表包含了名为 ShortCode nvarchar(12) 代表该记录的全球唯一代码。

现在有什么办法可以找到 ShortCode 值,例如 AST_SHIP_FIRE 存在于数据库中的任何一张表中。

:ShortCode 是用户定义的。

目前我正在尝试下面的代码,它的工作,但我必须为所有的表编码。

if (entities.Table1.Any(x =>  x.ShortCode.Trim().ToLower() == a.ShortCode.Trim().ToLower()) 
{return false;}
else if(entities.Table2.Any(x => x.ShortCode.Trim().ToLower() == a.ShortCode.Trim().ToLower()))
{return false;}
else if( entities.Talble3.Any(x => x.ShortCode.Trim().ToLower() == a.ShortCode.Trim().ToLower()))
{return false;}
.
.
.
else
{
//insert code
}

我想可能有更有效的方法。

c# entity-framework linq-to-entities
1个回答
2
投票

好吧,也许不是很直接,但让我们来做吧!

首先定义一个接口,用于 ShortCode 属性,并由任何拥有该属性的实体来实现它。

public interface ITableWithShortCode
{
    public string ShortCode { get; set; }
}

public class Table1 : ITableWithShortCode
{
    public long Id { get; set; }
    public string ShortCode { get; set; }
}

public class Table2 : ITableWithShortCode
{
    public long Id { get; set; }
    public string ShortCode { get; set; }
}

现在利用 Reflection 你可以写一个这样的方法。

public bool IsExistShortCode(string shortCode)
{
    using (var context = new AppDbContext())
    {
        /* 
           find all tables that are defined in your DbContext and are implemented ITableWithShortCode like:
           public DbSet<Table1> Table1 { get; set; }
           public DbSet<Table2> Table2 { get; set; }
           ...
        */
        var properties = typeof(AppDbContext).GetProperties()
            .Where(p => p.PropertyType.IsGenericType
                && typeof(ITableWithShortCode).IsAssignableFrom(p.PropertyType.GenericTypeArguments[0]));

        foreach (var property in properties)
        {
            var contextProp = (IQueryable<ITableWithShortCode>)property.GetValue(context);
            bool isExist = contextProp.Any(p => p.ShortCode == shortCode);
            if (isExist)
                return true;
        }

        return false;
    }
}

注意: 你可以在这段代码上做一些优化,我更倾向于让它保持在最简单的状态来展示这个想法。但是在生产中,例如你可以很容易地在启动时缓存DbContext属性,并在之后使用它。

© www.soinside.com 2019 - 2024. All rights reserved.