2013-01-07 51 views
9

Tôi cần tìm hiểu xem có thể tự động tạo truy vấn với LINQ hay không, tự động chọn bảng để thực hiện truy vấn.Truy vấn động bằng LINQ to SQL

Đây là một ví dụ về những gì tôi sẽ làm gì:

//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>(); 
    } 

Có một cách để làm điều này có thể?

+0

Bạn có thể refere những bài viết này và câu trả lời: http: //weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx http://social.msdn.microsoft.com/Diễn đàn/eu/linqprojectgeneral/thread/d9ffe9a1-59c3-4776-900a-4b45e0b4abcf http://stackoverflow.com/questi tiện ích/7800770/how-can-you-dynamic-select-a-table-với-entity-framework-4-x http://www.west-wind.com/weblog/posts/2007/Aug/13/LINQ -to-SQL-và-Động-Truy vấn-và-Biểu thức –

+0

Tôi sẽ cố gắng tìm kiếm tại các liên kết đó. Tôi sẽ cho bạn biết nếu tôi tìm thấy một cái gì đó hữu ích. – benVG

+0

chúc may mắn, nó sẽ rất dễ dàng cho bạn, tôi nghĩ! –

Trả lời

3

Nếu truy vấn đơn giản này, bạn có thể tự động tạo một câu lệnh sql chuẩn và thực thi nó, đây là cách đơn giản nhất mà không cần xử lý sự phản chiếu nặng và mã phức tạp?

var query = "SELECT * FROM " + tableName; 
var res = context.ExecuteQuery<dynamic>(query).ToList(); 
+1

Điều này sẽ cung cấp cho bạn một loại ẩn danh, nhưng không phải là kết quả động! –

+0

@MohamedSakherSawan - Cảm ơn đúng Tôi đã chỉnh sửa – CR41G14

+1

Tôi không thể, trong dự án chúng tôi chỉ có thể sử dụng LINQ to SQL, là một trong những yêu cầu của khách hàng (nó là một plug-in cho một ứng dụng đã tồn tại). – benVG

1

Tôi đã tìm được cách để làm điều đó, nhưng tôi không chắc liệu tôi có sử dụng mã này hay không. Nếu bạn có một DataContext có chứa hai bảng:

PrimaryTable 
    ID, 
    FirstValue, 
    SecondValue 

SecondaryTable 
    ID, 
    FirstSecondaryValue 

Bạn có thể sử dụng DataHelper lớp sau:

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); 
    } 
} 

Sau đó, bạn có thể tạo một thể hiện của DataHelper của bạn và gọi phương thức GetWhatIWant, đi qua trong tên bảng.

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(); 
+0

Tôi sẽ làm việc trên giải pháp này .. Tôi sẽ cho bạn biết nếu nó hoạt động cho tôi .. – benVG

-2
 

var esql = "select t from TypeName as t" 
var q = db.CreateQuery(esql); 

Sử dụng thực thể sql cho LINQ to SQL, http://esql.codeplex.com

-1

bạn Generic Phương pháp và có thể sử dụng db.Set<T> mà trả về một DbSet Dựa trên T