[英]Dynamic query using LINQ to SQL
我需要弄清楚是否可以使用 LINQ 動態構建查詢,動態選擇要在其中執行查詢的表。
這是我會做的一個例子:
//Not working,just for example
public List<dynamic> _getGenericList(String tableName)
{
var l = from a in db.//I need to use here tableName
select a;
return l.ToList<dynamic>();
}
有沒有辦法使這成為可能?
如果查詢這么簡單你可以動態創建一個標准的sql語句並執行它,這是最簡單的方法而不使用處理器繁重的反射和復雜的代碼?
var query = "SELECT * FROM " + tableName;
var res = context.ExecuteQuery<dynamic>(query).ToList();
我找到了一種方法,但我不確定是否會使用此代碼。 如果您有一個包含兩個表的 DataContext:
PrimaryTable
ID,
FirstValue,
SecondValue
SecondaryTable
ID,
FirstSecondaryValue
您可以使用以下 DataHelper 類:
class DataHelper
{
public MyDatabaseDataContext db = new MyDatabaseDataContext();
List<dynamic> GetDynamicList<T>() where T : class
{
System.Data.Linq.Table<T> table = db.GetTable<T>();
var result = from a in table select a;
return result.ToList<dynamic>();
}
public List<dynamic> 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<dynamic>)method.Invoke(this, null);
}
}
然后,您可以創建 DataHelper 的實例並調用 GetWhatIWant 方法,傳入表名。
var dataHelper = new DataHelper();
List<dynamic> 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<dynamic> mySecondList = dataHelper.GetWhatIWant("SecondaryTable");
for (int i = 0; i < 5 && i < mySecondList.Count; i++)
{
System.Console.WriteLine(mySecondList[i].FirstSecondaryValue.ToString());
}
System.Console.ReadKey();
我知道這很舊,但是如果您像我一樣在這里尋找答案,那么這可能會有所幫助。 我直接使用 .NET ObjectContext而不是DataContext數據源。 如果您使用的是 DataContext 版本,那么您可以簡單地(我希望)使用queryResults = myGlobalContext.ExecuteQuery<dbGenericData>(query).ToList();
相反,我很確定它會以同樣的方式工作。
如果您在命名和設計方面有標准,那么您的表格將更容易使用
這將允許您通過簡單地將“ID”字符串附加到表名上來輕松構建 ID 字段,並允許您在需要時使用可靠的 CAST。
說到 CAST,您會注意到查詢字符串中有一個。 您將需要使用 CAST 修改 SQL 字符串的使用,更改字段長度,如我的 nvarChar(50) 示例等,以克服從數據庫中獲取各種類型的數據。
最后說明:在查詢字符串中,您將看到我使用“AS”關鍵字將 DB 字段轉換為新名稱。 我將“tableIDField”轉換為名稱“id”,並將“requestedField”轉換為名稱“dbData”。 這允許系統將重命名的字段從 DB 匹配到我們將數據轉儲到的 STRUCT 對象容器中。 這允許您構建通用容器來保存返回的數據,而不必擔心與數據庫字段名稱匹配。
我不是這方面的專家,但我希望這對某人有所幫助。
private void testMethod(string requestedField, string tableName)
{
var tableIDField = tableName + "ID";
var query = "select " + tableIDField + " as id, CAST(" + requestedField + "as nvarchar(50)) as dbData from " + tableName;
List<dbGenericData> queryResults = null;
try
{
queryResults = myGlobalContext.ExecuteStoreQuery<dbGenericData>(query).ToList();
}
catch (Exception ex)
{
//Simply ignore any exceptions.
//These will need examined to determine best solution to unexpected results.
}
}
private struct dbGenericData
{
public dbGenericData(int id, string dbData)
{
this = new dbGenericData();
ID = id;
DBData = dbData;
}
public int ID { get; set; }
public string DBData { get; set; }
}
您可以使用通用方法並使用db.Set<T>
返回基於T
的DbSet
var esql = "select t from TypeName as t" var q = db.CreateQuery(esql);
使用實體 sql for linq to sql, http://esql.codeplex.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.