2009-03-16 42 views
7

Trong cơ sở dữ liệu, tôi có một bảng gọi là Liên hệ. Tên đầu tiên và các trường chuỗi khác được thiết kế để sử dụng kiểu dữ liệu Char (không phải thiết kế cơ sở dữ liệu của tôi). Đối tượng của tôi Liên lạc bản đồ với một loại chuỗi trong các thuộc tính. Nếu tôi muốn thực hiện một thử nghiệm đơn giản truy xuất đối tượng Địa chỉ liên hệ theo id, tôi sẽ làm một việc như sau:Làm thế nào để cắt các giá trị bằng cách sử dụng LINQ to Sql?

Contact contact = db.Contacts.Single(c => c.Id == myId); 
Contact test = new Contact(); 
test.FirstName = "Martin"; 

Assert.AreEqual(test.FirstName, contact.FirstName); 

Giá trị liên hệ.FirstName là "Martin" do loại char. Tôi có thể chặn thuộc tính FirstName khi nó đang được tải ở đâu? OnFirstNameChanging (giá trị chuỗi) không được gọi trên tải ban đầu (liên hệ), nhưng trên đối tượng thử nghiệm.

Trả lời

8

Có thể bạn có thể đặt nó trong phương thức một phần được tải sẵn()? Lưu ý: Tôi chưa bao giờ sử dụng điều này, nhưng tôi cho rằng nó sẽ trông như sau:

public partial class Contact 
{ 
    partial void OnLoaded() 
    { 
     FirstName = FirstName.Trim(); 
    } 
} 
+0

Tính năng này hoạt động. Nó là khá dễ dàng để làm cho từng lĩnh vực bởi vì tôi không hiển thị nhiều lĩnh vực để hiển thị. Cảm ơn. – Marsharks

+0

Điều này sẽ tạo sự kiện đã thay đổi thuộc tính - điều này có thể kích hoạt các hành động khác - và có thể dẫn đến các bản cập nhật không cần thiết cho cơ sở dữ liệu vì bạn đang thay đổi giá trị của thuộc tính mà không thực hiện bất kỳ thay đổi ngữ nghĩa nào cho nội dung. – tvanfosson

+3

Điểm của câu hỏi là tìm ra nơi để làm logic như vậy (trong trường hợp này là OnLoaded()); Bản thân phương thức có thể dễ dàng bao gồm "_FirstName = _FirstName.Trim();" để tránh sự kiện kích hoạt sự kiện đúng đắn. –

1
Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId); 

Và kiểm tra xem nhà cung cấp LINQ có dịch sang SQL thích hợp không.

+0

Tôi không nghĩ rằng vấn đề là với trường Id. – tvanfosson

+1

@tvanfosson - Tôi nghĩ rằng các op dự định nó cho các ví dụ vì lợi ích duy nhất, không được thực hiện theo nghĩa đen. –

6

Nếu bạn không thể thay đổi giản đồ, bạn có thể muốn tạo accessor được thiết kế riêng tư/được bảo vệ và tạo accessor công khai cho front-end thuộc tính trong thực thi một phần. Sau đó, bạn có thể Cắt giá trị trong trình truy cập get.

public partial class Contact 
{ 

    public string RealFirstName 
    { 
     get { return this.FirstName.Trim(); } 
     set { this.FirstName = value; } 
    } 

    ... 
} 
+1

Đây là một giải pháp tốt, bởi vì không chỉ là các trường kiểu char, chúng còn được gọi là First_Name. Vì vậy, tôi có thể sửa chữa tất cả các lĩnh vực là tốt, mà không thay đổi nó trong thiết kế Object của tôi. – Marsharks

+0

Vấn đề là khi tôi tạo một truy vấn và cố gắng sử dụng một cái gì đó như FullName = c.FirstName + '' + c.LastName. Tôi đã nhận được biểu thức Không thể dịch và không thể coi nó là một biểu thức địa phương. – Marsharks

+0

Khi bạn đã hoàn tất việc lọc, bạn có thể sử dụng ToList() để tạo truy vấn thực tế sau đó thực hiện lựa chọn của bạn trên danh sách kết quả. Vì chúng là đối tượng tại thời điểm đó nên việc xây dựng FullName sẽ hoạt động. – tvanfosson

0

Bạn có thể chạy ForEach trong danh sách địa chỉ liên hệ trước khi tìm kiếm Martin.

var contacts = db.Contacts.ForEach(c => c.FirstName = c.FirstName.Trim()); 
Contact contact = contacts.Single(c => c.Id == myId); 
contact.FirstName // = "Martin" 

Nhưng cách này không dễ bảo trì nếu nó phải được thực hiện cho nhiều trường.

+0

Điều gì sẽ xảy ra nếu anh ta có 100.000 địa chỉ liên hệ? –

1

Tùy thuộc vào điều khiển bạn có trên lược đồ và mã.

Nếu các giá trị đang được thiết lập bằng cách gọi một hàm tạo với tất cả các tham số, hãy làm các đường viền, v.v ... khi chúng được gán cho các biến thành viên.

Nếu chúng đang được gán cho các thuộc tính (có thể là từ ví dụ), hãy thay đổi bộ truy cập SET để nó cắt ở đó.

Bạn có các vấn đề tiềm năng nếu bạn thực sự MUỐN không gian đầu hoặc cuối tại một số điểm.

Nếu bạn không thể sửa đổi mã lớp cơ sở, hãy thử sử dụng các lớp từng phần hoặc kế thừa từ lớp và ghi đè các thuộc tính ở đó.

Nếu bạn không thể làm điều đó, gợi ý cuối cùng của tôi là viết một lớp nhà máy nào đó để bạn truyền một đối tượng đã tạo và nó dọn dẹp nó theo các quy tắc bạn muốn.

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