我想通过使用变量来动态获取表名,但是当我将该表放回原位时,无法使用LINQ查询它。
第一步:我通过使用参数获取表名
var tableName = GetTable("Customer");
第二步:
public static object GetTable(string tblName)
{
ALLDBEntities db = new ALLDBEntities();
var table = db.GetType().GetProperty(tblName).GetValue(db) as IEnumerable;
return table;
}
这是我想要实现的
public List<Records> GetNonDuplicateRecords(string tableName)
{
ThreeEntities threeentities = new ThreeEntities();
List<Records> recs = (from p in threeentities.TableName "Should use this"
select new Records
{
_claimNumber = p.ClaimNumber,
_firstname = p.PatientFirstName,
_lastname = p.PatientLastName,
_client = p.Client
}).ToList<Records>();
return recs;
}
这将按预期返回我的表/数据库集,并强制转换为IEnumerable,但是当我尝试使用LINQ查询此数据集/表时,它不允许我
对此有任何帮助吗?
答案 0 :(得分:0)
IEnumerable不会扩展LINQ内容。您必须使用通用的IEnumerable。由于您没有表格的类型,因此必须通过反射创建通用的IEnumerable类型
//编辑[21.09.2018]
请查看以下代码。
static void Main(string[] args)
{
var records = GetNonDuplicateRecords("Records");
}
public static IQueryable<T> GetTable<T>(string tblName)
{
ALLDBEntities db = new ALLDBEntities();
var table = db.GetType().GetProperty(tblName).GetValue(db) as List<T>;
return table.AsQueryable();
}
public static List<Records> GetNonDuplicateRecords(string tableName)
{
List<Records> recs = (from p in GetTable<RecordTable>(tableName)
select new Records
{
_claimNumber = p.ClaimNumber,
_firstname = p.PatientFirstName,
_lastname = p.PatientLastName,
_client = p.Client
}).ToList<Records>();
return recs;
}
public class Records
{
public object _claimNumber { get; set; }
public object _firstname { get; internal set; }
public object _lastname { get; internal set; }
public object _client { get; internal set; }
}
public class RecordTable
{
public object ClaimNumber { get; set; }
public object PatientFirstName { get; internal set; }
public object PatientLastName { get; internal set; }
public object Client { get; internal set; }
}
public class ALLDBEntities
{
public List<RecordTable> Records { get; set; } = new List<RecordTable>
{
new RecordTable{ClaimNumber = "asdadsasd"}
};
}
如果使用EF,则必须使用GetValue(db) as List
而不是GetValue(db) as DbSet
。我现在还不清楚是使用EF还是其他方法。
一些提示:
尽管您已经编辑了代码,但是我不清楚您正在处理哪些数据。在我看来Record
不是您的数据库模型。如果正确,那么在使用EF + linq2sql时,您无法从数据库模型中选择“普通” C#类,除非您先调用ToList()或进行其他操作。
原因是您的选择必须转换为纯SQL,并且基础SQL提供程序jsut不知道如何用原始SQL表示select => new Record()
。
答案 1 :(得分:0)
使用此:
IEnumerable<object> tableName = (IEnumerable<object>)GetTable("Customer");
您必须转换从GetTable接收的对象。 在这种情况下,返回之前进行投射无济于事。