我在数据库中有100多个表,其中60多个表包含名为ShortCode nvarchar(12)
的列,它们代表该记录的全局唯一代码。
现在有任何方法可以找到ShortCode
值,例如AST_SHIP_FIRE
存在于数据库的任何表中。
Note: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
}
我认为可能有更有效的方法。
好吧,不是很简单,但是让我们做吧!
首先为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; }
}
现在您可以编写这样的方法:
public bool IsExistShortCode(string shortCode)
{
using (var context = new AppDbContext())
{
var properties = typeof(AppDbContext).GetProperties()
.Where(p => p.PropertyType.IsGenericType
&& typeof(ITableWithShortCode).IsAssignableFrom(p.PropertyType.GenericTypeArguments[0]));
foreach (var property in properties)
{
dynamic contextProp = property.GetValue(context);
bool isExist = ((IQueryable<ITableWithShortCode>)contextProp).Any(p => p.ShortCode == shortCode);
if (isExist)
return true;
}
return false;
}
}