检查所有表中同一列的值 [Entity Framework]
Check value of same column in all tables [Entity Framework]
我在数据库中有超过 100 个 table,其中 60+ table 包含名为 ShortCode nvarchar(12)
的列,代表该记录的全局唯一代码。
现在有什么方法可以找到 ShortCode
值,例如。 AST_SHIP_FIRE
出现在数据库中的任何 table 中。
注:ShortCode
为用户自定义。
目前我正在尝试下面的代码,它可以工作,但我必须为所有 table.
编写代码
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
}
我认为可能有更有效的方法。
好吧,也许不是很简单,但让我们开始吧!
首先为 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 属性并在之后使用它
我在数据库中有超过 100 个 table,其中 60+ table 包含名为 ShortCode nvarchar(12)
的列,代表该记录的全局唯一代码。
现在有什么方法可以找到 ShortCode
值,例如。 AST_SHIP_FIRE
出现在数据库中的任何 table 中。
注:ShortCode
为用户自定义。
目前我正在尝试下面的代码,它可以工作,但我必须为所有 table.
编写代码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
}
我认为可能有更有效的方法。
好吧,也许不是很简单,但让我们开始吧!
首先为 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 属性并在之后使用它