Hãy xem xét một cơ sở dữ liệu với nhiều bảng được xây dựng bằng cách sử dụng mã khung Entity trước tiên. Mỗi bảng chứa một loại đối tượng khác nhau, nhưng tôi muốn tạo một lớp trình xây dựng truy vấn chung duy nhất cho mục đích mở rộng. Cho đến nay như một khuôn khổ cho các lớp học này, tôi có một lớp chung như vậy có ý định đóng vai trò như là một wrapper cho LINQ to SQL:Cách tạo C# Generic Linq Querier?
public class DBQuerier<T>
where T : class
{
DbSet<T> relation;
public DBQuerier(DbSet<T> table)
{
relation = table;
}
public bool Exists(T toCheck);
public void Add(T toAdd);
public T (Get Dictionary<String, Object> fields);
public bool SubmitChanges();
public void Update(T toUpdate, Dictionary<String, Object> fields);
public void Delete(T toDelete);
}
Vấn đề của tôi đi kèm với các rào cản đầu tiên khi cố gắng kiểm tra xem nếu một bản ghi tồn tại vì tôi không thể chuyển đổi giữa loại T chung và kiểu đối tượng mà tôi đang cố gắng làm việc. Nếu tôi sử dụng cơ sở LINQ:
public bool Exists(T toCheck)
{
return (from row in relation
where row.Equals(toCheck)
select row).Any();
}
Một ngoại lệ thời gian chạy xảy ra như SQL không thể làm việc với bất cứ điều gì nhưng loại nguyên thủy ngay cả khi tôi thực hiện IComparable
và chỉ định Equals của riêng tôi mà so sánh một lĩnh vực duy nhất. Lambda Expressions dường như đến gần hơn, nhưng sau đó tôi nhận được vấn đề một lần nữa với SQL không thể xử lý nhiều hơn các loại nguyên thủy mặc dù hiểu biết của tôi đã được rằng Expression.Equal
buộc Hà Nội phải sử dụng lớp chức năng tương tự:
public bool Exists(T toCheck)
{
ParameterExpression T1 = Expression.Parameter(typeof(myType), "T1");
ParameterExpression T2 = Expression.Parameter(typeof(myType), "T2");
BinaryExpression compare = Expression.Equal(T1, T2);
Func<T, T, bool> checker =
Expression.Lambda<Func<T, T, bool>>
(compare, new ParameterExpression[] { T1, T2 }).Compile();
return relation.Where(r => checker.Invoke(r, toCheck)).Any();
}
Khái niệm cây được thiết kế trong tâm trí để sau này tôi có thể thêm một tuyên bố chuyển đổi để xây dựng truy vấn theo loại tôi đã cố gắng để xem xét. Câu hỏi của tôi là: Có cách nào đơn giản hơn/tốt hơn để làm điều này (hoặc sửa chữa những gì tôi đã thử cho đến nay) vì chỉ có các tùy chọn khác tôi có thể thấy là viết một lớp cho mỗi bảng (không dễ mở rộng) hoặc kiểm tra mỗi bên ứng dụng hồ sơ (có khả năng khủng khiếp chậm nếu bạn phải chuyển toàn bộ cơ sở dữ liệu!)? Xin lỗi nếu tôi đã phạm sai lầm rất cơ bản vì tôi đã không làm việc với phần lớn điều này trong một thời gian rất dài, cảm ơn trước!
Lưu ý phương thức 'Exists' của bạn chỉ là một phương thức' Chứa' được đổi tên mà không thực hiện tốt. – Servy
Nếu bạn có một cột khóa chính, bạn luôn có thể sử dụng phương thức 'relation.Find (Id)' để kiểm tra xem nó có tồn tại không. – Nilesh