使用LINQ to SQL进行动态查询
我需要弄清楚是否可以使用LINQ动态构建查询,动态选择要在其中执行查询的表。
这是我要做的一个例子:
//Not working,just for example public List _getGenericList(String tableName) { var l = from a in db.//I need to use here tableName select a; return l.ToList(); }
有没有办法让这成为可能?
如果查询很简单,你可以动态创建一个标准的sql语句并执行它,这是最简单的方法,而不使用处理器大量reflection和复杂的代码?
var query = "SELECT * FROM " + tableName; var res = context.ExecuteQuery(query).ToList();
我找到了一种方法,但我不确定我是否会使用此代码。 如果您有一个包含两个表的DataContext:
PrimaryTable ID, FirstValue, SecondValue SecondaryTable ID, FirstSecondaryValue
您可以使用以下DataHelper类:
class DataHelper { public MyDatabaseDataContext db = new MyDatabaseDataContext(); List GetDynamicList() where T : class { System.Data.Linq.Table table = db.GetTable (); var result = from a in table select a; return result.ToList(); } public List GetWhatIWant(string tableName) { Type myClass = Type.GetType("DynamicLinqToSql." + tableName); MethodInfo method = typeof(DataHelper).GetMethod("GetDynamicList", BindingFlags.NonPublic | BindingFlags.Instance); method = method.MakeGenericMethod(myClass); return (List )method.Invoke(this, null); } }
然后,您可以创建DataHelper的实例并调用GetWhatIWant方法,并传入表名。
var dataHelper = new DataHelper(); List myFirstList = dataHelper.GetWhatIWant("PrimaryTable"); for (int i = 0; i < 5 && i < myFirstList.Count; i++) { System.Console.WriteLine(String.Format("{0} - {1}", myFirstList[i].FirstValue.ToString(), myFirstList[i].SecondValue.ToString())); } List mySecondList = dataHelper.GetWhatIWant("SecondaryTable"); for (int i = 0; i < 5 && i < mySecondList.Count; i++) { System.Console.WriteLine(mySecondList[i].FirstSecondaryValue.ToString()); } System.Console.ReadKey();
你可以使用Generic Method并使用db.Set
返回基于T
的DbSet
var esql =“从TypeName中选择t作为t” var q = db.CreateQuery(esql);
使用实体sql for linq to sql, http://esql.codeplex.com