2011-12-28 49 views
5

Tôi muốn sắp xếp theo kết quả của mình với số lần đối sánh trong chuỗi ký tự của tôi.Tách chuỗi bằng LINQ

Vì vậy, đây là mã

.ThenByDescending(p => p.Title.ToLower() 
           .Split(' ') 
           .Count(w => words.Any(w.Contains))); 

Nhưng nó mang lại cho tôi lỗi và nói rằng LINQ không thể phân tích Split vào SQL.

LINQ to Entities không nhận ra phương pháp 'System.String [] Split (Char [])' phương pháp, và phương pháp này không thể được dịch sang một biểu cửa hàng.

Làm cách nào để triển khai chia tách qua LINQ?

Ví dụ, đối với mảng này thì phải đặt hàng theo cách này

words = { "a", "ab" } 

ab a ggaaag gh //3 matches 
ba ab ggt //2 matches 
dd //0 matches 

Trả lời

8

nó có nghĩa là LINQ to Entities thất bại trong việc tìm bản dịch của phương pháp phân chia có thể được viết như truy vấn sql. nếu bạn muốn thực hiện chức năng phân chia, bạn phải mang lại các bản ghi trong bộ nhớ bằng cách gọi ToList(), AsEnumerable(), vv

var result = (from t in db.Table 
       select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....); 
+0

Nhưng điều đó sẽ khiến tải tất cả dữ liệu trong bộ nhớ và thực hiện chuyển đổi LINQ thành đối tượng với bộ nhớ, nó sẽ không? – abatishchev

+0

Đúng vậy. Tối ưu bạn có thể áp dụng các điều kiện trong mệnh đề where trước khi gọi 'AsEnumerable'. bạn không thể làm điều đó mà không mang các vật thể vào bộ nhớ –

+0

Tôi đoán nó sẽ sụp đổ với các bảng lớn. Tôi đồng ý với abatishchev. –

2

Bạn sẽ cần phải thực hiện việc phân loại trong LINQ to Objects vì LINQ to Entities không thể dịch mã C# vào SQL (hoặc ngôn ngữ của bất kỳ DB nào bạn đang sử dụng).

Bạn có thể làm điều đó như thế này.

var results = 
    objectContext 
    .Where(a => a == b) //Whatever 
    .AsEnumerable() 
    .ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains))); 

AsEnumerable() (cùng với ToArray() hoặc ToList()) xoay LINQ to Entities trở lại vào LINQ to Objects.

2

Người ta không thể mong đợi LINQ to Entities có thể chuyển đổi thành SQL.

Giải pháp tốt nhất là thay đổi giản đồ sao cho mỗi từ trong tiêu đề của bài đăng được lưu trữ dưới dạng hàng riêng biệt trong một bảng riêng biệt (với các liên kết thích hợp). Truy vấn sau đó có thể sử dụng các hoạt động nối nhóm (nhóm) rõ ràng hoặc thuộc tính kết hợp FK.

Nếu bạn không thể thực hiện điều này và muốn truy vấn chạy trên cơ sở dữ liệu, bạn sẽ phải xem xét việc viết hàm do người dùng xác định để làm việc với các chuỗi được phân cách. Đọc this question để biết thêm thông tin. Điều này sẽ được rất nhiều công việc mặc dù.

Giải pháp dễ nhất (nếu bạn có đủ khả năng để làm điều đó) tất nhiên là kéo mọi thứ trở lại máy khách chỉ sử dụng LINQ to Objects cho phần đó của truy vấn, như được đề cập bởi @Muhammad Adeel Zahid.

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