我的应用程序现在可以使用5个表,也许将来会有更多,我想尽量减少代码重复。下面是一个用于Swd0004的示例,我也有用于Swd0013的相同代码,以及每个表的其他重复函数。用户可以从下拉框中选择要使用的表。我想接受这个下拉框选择,并以某种方式将其传递给函数。
private void SWD_0004_Lookup()
{
using (var ctx = new EFContext())
{
var query = ctx.Swd0004;
var readList = query.ToList();
Debug.WriteLine("QUERY COUNT: " + readList.Count);
// create datatable from query results so I can populate datagridview
var dt = LINQResultToDataTable(query);
dgvQueryResults.DataSource = dt;
GetColumnHeaders(dt);
DataDT = dt; // copy local dt so we can use DataDT for getting record data
}
}这是一个数据库优先的应用程序。Swd0004是数据库中的一个表,因此是我的EFContext类中的一个DbSet。我的Swd0004类:
namespace SWDDB.Models
{
public partial class Swd0004
{
public int Id { get; set; }
public string PartNumber { get; set; }
...那么我需要添加一个泛型来实现@abdusco答案吗?也许我对泛型还不够熟悉。
public partial class Swd0004<TEntity> : ??? where TEntity : class下面是另一个例子:
private List<Swd0004> ConvertDT(DataTable dt)
{
var importList = new List<Swd0004>();
// convert DataRow object to SWD object, otherwise BulkInsert will fail
foreach (DataRow row in dt.Rows)
{
var obj = CreateItemFromRow<Swd0004>(row);
// BulkInsert needs a list
importList.Add(obj);
}
return importList;
}如您所见,我必须显式地声明Swd0004三次。因此,我必须为每个表重复此函数5次。
UPDATE我正在尝试实现@bolkay建议的内容。我创建了这个类:
using SWDDB.Models;
using System.Diagnostics;
using System.Linq;
namespace SWDDB
{
public abstract class BaseLookup<TEntity> where TEntity : class
{
public virtual void PerformLookup()
{
using (var ctx = new EFContext())
{
var query = ctx.Set<TEntity>();
Debug.WriteLine("QUERY COUNT: " + query.ToList().Count);
}
}
}
public class SWD0004Lookup : BaseLookup<Swd0004>
{
}
}感觉我已经很接近了,但是我不知道如何从我的主线代码调用PerformLookup。
发布于 2020-12-11 01:16:39
我不完全理解用户选择要使用的表背后的逻辑。
您可以这样做,以此为起点来删除重复的方法。
使用逻辑创建一个基类。
public abstract class BaseLookUp<TEntity> where TEntity : class
{
public virtual void PerformLookup()
{
using (var ctx = new EFContext())
{
var query = ctx.Set<TEntity>();
//etc...
}
}
}
public class SWD004Lookup : BaseLookUp<SWD004004>
{
}完全根据你的需要,你可以把它变成一个静态的方法等等。
发布于 2020-12-11 01:13:20
You can get a DbSet using DbContext.Set(),而不是使用EfContext类中的属性:
private void SWD_Lookup<TEntity>() // <-- turn it into a generic method
{
using (var ctx = new EFContext())
{
var query = ctx.Set<TEntity>(); // <-- get dbset by passing the type
// ...
}
}然后你可以这样叫它:
SWD_Lookup<Swd0004>();
SWD_Lookup<Swd0013>();https://stackoverflow.com/questions/65238973
复制相似问题