2009-11-26 40 views
16

Sử dụng LINQ, làm thế nào tôi có thể lấy tên cột của bảng? C# 3.0, 3.5 khuôn khổLINQ: Lấy Tên Cột Bảng

+0

Được gắn thẻ lại thành 'linq-to-sql', vui lòng chỉnh sửa câu hỏi của bạn nếu bạn có nghĩa là một số loại" LINQ "khác. –

+0

Thật không may truy vấn này chạy bên trong LINQPad vì vậy làm thế nào để tôi có được bối cảnh trong LINQPad? –

Trả lời

5

tôi giả sử bạn có nghĩa là bằng cách sử dụng LINQ to SQL, trong đó xem xét trường hợp tại DataContext.Mapping tài sản. Đó là những gì tôi sử dụng.

Nếu bạn không có ý đó, có lẽ bạn có thể giải thích về những gì bạn đang cố gắng đạt được?

+0

Tôi muốn viết một chương trình bằng LINQPad (C#) Điều đó có thể xây dựng các câu lệnh chèn SQL cho khóa học này, tôi yêu cầu các tên cột của các bảng. –

+5

điều này có thể được làm rõ một chút ... đây không phải là câu trả lời. –

+1

Một số ví dụ sử dụng sẽ là tuyệt vời. API ánh xạ hơi không trực quan để nói ít nhất ... –

0

Lặp các thuộc tính của lớp L2S của bạn với sự phản ánh

2

Sử dụng phương thức ExecuteQuery trên bối cảnh dữ liệu của bạn và thực hiện kịch bản SQL này:

var columnNames = ctx.ExecuteQuery<string> 
    ("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('your table name');"); 

này mang đến cho bạn một IEnumerable<string> với tất cả các tên cột trong bảng mà bạn chỉ định.

Tất nhiên, nếu bạn muốn và cần, bạn luôn có thể truy xuất thêm thông tin (ví dụ: loại dữ liệu, độ dài tối đa) từ chế độ xem danh mục sys.columns trong SQL Server.

0

Nếu bạn đang nói về việc lấy các cột cho bảng được ánh xạ, hãy xem this answer để xem cách truy cập thuộc tính cột. Từ đó, bạn có thể lấy tên cột, loại, v.v.

6

Tôi tình cờ gặp câu hỏi này và tìm câu trả lời thực sự tốt ở đây. Đây là những gì tôi nghĩ ra. Chỉ cần ném nó vào LINQPad dưới chế độ biểu thức C#.

from t in typeof(UserQuery).GetProperties() 
where t.Name == "Customers" 
from c in t.GetValue(this,null).GetType().GetGenericArguments()[0].GetFields() 
select c.Name 

Sửa đổi khi bạn thấy phù hợp.

17

lẽ là quá muộn nhưng, tôi giải quyết vấn đề này bằng mã này

var db = new DataContex(); 
var columnNames = db.Mapping.MappingSource 
         .GetModel(typeof(DataContex)) 
         .GetMetaType(typeof(_tablename)) 
         .DataMembers; 
+1

Cảm ơn bạn, bạn vừa tiết kiệm cho tôi một lượng thời gian của thuyền. Điều này tốt hơn câu trả lời được chấp nhận vì điều này cho thấy cách sử dụng thuộc tính DataContext.Mapping. –

+3

Để sử dụng VB.Net 'GetType (DataContext)' thay vì 'typeof (DataContext)'. – Zarepheth

2

tôi đã sử dụng mã này trong LinqPad

from t in typeof(table_name).GetFields() select t.Name 
+0

Lưu ý rằng đó là phiên bản chưa được phân tách của tên bảng. –

15

Mã dưới đây sẽ làm việc từ trả về tất cả các tên cột của bảng

var columnnames = from t in typeof(table_name).GetProperties() select t.Name 
+2

Không chắc tại sao điều này không được bình chọn, đó là câu trả lời thanh lịch nhất. Đây là cú pháp tương đương lambda: var columnnames = typeof (table_name) .GetProperties(). Select (t => t.Name); – draconis

+0

Có thể điều này không được bình chọn vì bạn không chỉ nhận được các cột mà còn cả các thuộc tính bổ sung nữa. Nó thường là một phần lớp với khả năng mở rộng trong tâm trí sau khi tất cả. – mbx

0
  var query = from x in DataBase.Table_Name 
         select x.Column_Name; 
0

sp_help 'TableName'

Một lựa chọn cho một cửa sổ LinqPad SQL để ms sql máy chủ

0

Trong LinqPad:

TableNames.Take (1) hoạt động.

Rất nhanh để nhập. (Mặc dù bạn ở một thế giới lý tưởng, sẽ đẹp hơn nếu không chọn bất kỳ hàng nào.)

Lưu ý đây là dạng bảng số nhiều. Bạn cũng có thể thực hiện Take (0) và nhìn vào tab kết quả SQL.

Các vấn đề liên quan