簡體   English   中英

使用 LINQ to SQL 進行動態查詢

[英]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 字段始終為 X 類型(INT、GUID 等)
  • ID 字段始終命名為 tableNameID,即帶有 ID 標記的“表名稱”。
  • 等等,

這將允許您通過簡單地將“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>返回基於TDbSet

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM