2012-04-25 39 views
6

Tôi có 4 hộp kiểm này, cấu thành chuỗi biến saljes, kopes, bytes, erbjudes. Khi họ được kiểm tra, họ nhận được giá trị "on".Chứa(), cách đảo ngược bằng lambda

Từ đây tôi đặt cùng một biến chuỗi (p) chứa tất cả các số tôi muốn đưa vào câu lệnh LINQ. Giả sử nếu tất cả các hộp kiểm được chọn, tôi sẽ nhận được một chuỗi là "1234" và nếu chỉ hộp kiểm 2 và 4 được chọn, nó sẽ dẫn đến "24".

Trong cơ sở dữ liệu của tôi, tôi có một trường được gọi là "Loại" có kiểu int. Tôi muốn nói cho cơ sở dữ liệu bao gồm tất cả các hàng có giá trị "Loại" có thể được tìm thấy trong chuỗi p.

Something như thế này (tất nhiên mã của tôi không hoạt động, do đó tôi cần các anh):

 var searchResult = from s in db.Ads select s; 
     string p = "1"; 

     if (saljes != "on") 
      p = p.Replace("1", ""); 
     if (kopes == "on") 
      p += "2"; 
     if (bytes == "on") 
      p += "3"; 
     if (erbjudes == "on") 
      p += "4"; 

     searchResult = searchResult.Where(s => p.Contains(s => s.Type.ToString()); 

Những gì tôi kinda cần làm là một đảo ngược Chứa(), nhưng làm thế nào?

+0

Bạn không thể sử dụng 'IEnumerable p'? Bạn có thể luôn luôn 'String.Join' nếu bạn cần nó kết hợp, nhưng sẽ cho phép bạn kiểm soát nhiều hơn liên quan đến việc nhận giá trị riêng lẻ. Tùy chọn khác là sử dụng bit: 'Int32 p;' và kiểm tra '(p & 1)', '(p & 4)', v.v. –

+0

Vì vậy, nếu chuỗi của bạn là '" 234 "' một giá trị '24' nên được tìm thấy trong db của bạn? –

+1

Câu hỏi của bạn có một chút không rõ ràng đối với tôi - sẽ hữu ích khi xem một vài ví dụ về những gì bạn muốn xảy ra với các giá trị "Loại" khác nhau. –

Trả lời

1

Contains() đã là một 'TRÊN đảo ngược', như mô tả here:

int[] productList = new int[] { 1, 2, 3, 4 }; 

var myProducts = from p in db.Products 
       where productList.Contains(p.ProductID) 
       select p; 

Vì vậy, chỉ cần điền vào một danh sách:

var list = new List<int>(); 

if (saljes == "on") 
    list.Add(1); 
if (kopes == "on") 
    list.Add(2); 
if (bytes == "on") 
    list.Add(3); 
if (erbjudes == "on") 
    list.Add(4); 

var searchResult = db.Ads.Where(s => list.Contains(s.Type)); 
+1

Cảm ơn rất nhiều! Mặc dù tôi đã phải sửa đổi mã một chút. Nếu tôi đã thử biểu thức lambda trong Contains() nó nói "Không thể chuyển đổi biểu thức lambda thành kiểu int bởi vì nó không phải là một loại đại biểu". Mặc dù nếu tôi chỉ viết searchResult = searchResult.Where (s => list.Contains (s.Type)); nó hoạt động tốt. –

3

Không rõ ràng vấn đề là gì, nhưng điều này sẽ làm việc:

searchResult = searchResult.Where(s => p.Contains(s.Type.ToString()); 

p là chuỗi và Contains(string value) hy vọng chuỗi là tham số, vì vậy bạn không cần biểu thức lambda.

1

Biểu thức này có làm được không?

s => s.Type.ToString().ToCharArray().Except(p.ToCharArray()).Count() == 0 

Ví dụ: nếu s.Type24p"234" thì s.Type được bao gồm trong chuỗi. Nếu chúng ta chuyển đổi các int đến một char-mảng chúng tôi nhận

{'2', '4'} 

Chuỗi chuyển đổi sang một char-mảng là

{'2', '3', '4'} 

Nó có nghĩa là các chữ số của int đều bao gồm trong string. Vì vậy, các số int ngoại trừ các số string mang lại một bộ trống mà chúng tôi kiểm tra với Count() == 0.

{'2', '4'}.Except({'2', '3', '4'}) ==> { } 

Thay vì tạo ra một string, tôi sẽ tạo ra một List<char>

var p = new List<char>();    

if (saljes == "on") p.Add('1');    
if (kopes == "on") p.Add('2');    
if (bytes == "on") p.Add('3');    
if (erbjudes == "on") p.Add('4');    

Sau đó, biểu thức trở thành

s => s.Type.ToString().ToCharArray().Except(p).Count() == 0 

Tuy nhiên, nhận thức được thực tế là điều này không thể được được chuyển thành mệnh đề SQL-where thích hợp.Do đó toàn bộ bảng sẽ phải được quét.