2012-01-06 38 views
6

phương thức này trả về danh sách chung nhưng nó có nhiều điều kiện để chọn. Tôi chỉ viết điều này bằng cách sử dụng if - else if -else if .... rất nhiều nếu có ý tôi là Có cách nào ngắn hơn để thực hiện việc này không? Cảm ơn bạn.LINQ trong đó khoản có nhiều điều kiện

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
    { 
     var db = new requestsDBEntities(); 
     var listPrn = new List<ProductReqNoDate>(); 
     if (!string.IsNullOrEmpty(departmant)) 
     { 
      return (from r in db.requests 
         where r.departmant== departmant 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate , 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
     if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
     { 
      DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
      DateTime dtlastDate = Convert.ToDateTime(lastDate); 
      return (from r in db.requests 
         where r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate, 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
    } 
+0

Khi LINQ được thực thi khi lần đầu tiên truy cập kết quả, có lẽ bạn có thể đặt 'từ/vị trí' đầu tiên vào var và sau đó bên ngoài ifs, sử dụng truy vấn mới chọn vào tập kết quả đã truy xuất. – Aphelion

Trả lời

1

1 *

bạn có thể tìm thấy sollution tốt hơn nhưng tôi muốn giúp đỡ này (tôi điều) nhưng tôi sử dụng nó: bạn có thể làm bài kiểm tra ra chức năng này

List<ProductReqNoDate> yourList = GetRequestsQuery(string departmant, int reqStateID) 

    if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
    { 
     yourdatagrid.Itemsource = yourList.where(a=> a.reqDate <= Datetime.parse(firstDate) & a.reqDate >= Datetime.parse(lastDate)) 
    } 


public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID) 
{ 
    var db = new requestsDBEntities(); 
    var listPrn = new List<ProductReqNoDate>(); 
    if (!string.IsNullOrEmpty(departmant)) 
    { 
     return (from r in db.requests 
        where r.departmant== departmant 
        select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 

    } 
} 

và bạn có thể áp dụng bất kỳ điều kiện nào trong danh sách đầu tiên của bạn nhưng không được đề xuất trong ứng dụng gợn sóng hoặc nhiều thông tin trong cơ sở dữ liệu.

2 *

Hoặc bạn chỉ có thể thực hiện ngày đầu tiên và ngày cuối cùng; cho ví dụ nếu ngày không được đặt, hãy đặt ngày đầu tiên = 01/01/1900 và ngày cuối cùng là Ngày giờ.Hôm nay và luôn vượt qua ngày của bạn trong truy vấn LINQ

+0

cũng thực sự, tôi cần phải xem xét rất nhiều điều kiện để có được giá trị ... Danh sách công cộng GetRequestsQuery (chuỗi departmant, int reqStateID, chuỗi firstDate, chuỗi lastDate, string productName) .... i có nghĩa là nếu tất cả các điều kiện đúng là phải cho tôi câu trả lời được lọc. Hoặc một trong số họ là đúng, phần còn lại là sai ... vì vậy tôi cần phải viết tất cả các khả năng? nếu (a & b & c & d) khác nếu (a & b & c) khác nếu (a & c & d) khác nếu (b & c & d) khác nếu (a & b) khác nếu (a & c) ... etc ?? :))) – blackraist

0

một cái gì đó như thế này Tôi chưa biên soạn và kiểm tra nhưng nó sẽ cho bạn manh mối.

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
{ 
    using(var db = new requestsDBEntities()) 
    { 

     DateTime dtfirstDate =null; 
     DateTime.TryParse(firstDate,out dtfirstDate); 

     DateTime dtlastDate = null; 
     DateTime.TryParse(lastDate,out dtlastDate); 

     var result = (from r in db.requests 
        where 
         (r.departmant == departmant) 
        || (r.reqDate <= dtlastDate.Value && r.reqDate >= dtfirstDate.Value) 
        select new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 
    } 

} 

EDIT:

nếu bạn muốn sử dụng chức năng phi sql trong bộ lọc của bạn sau đó gọi ToList() trên bảng của bạn

var result = db.requests.ToList().Where(r => { 

    // do test for what you want 
    // so write a function to work out when you want to filter by 
    // name or date 
    return true; 

}).Select(r => new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter(db.products.Where(p=> p.reqNo == r.reqNo).Select(p=> p.prdctName).FirstOrDefault()) 
        }) 

vấn đề với điều này là bạn đang tải toàn bộ bảng vào bộ nhớ mà nếu tốt nếu bạn không thay đổi giá trị trong nó thường xuyên và nếu nó không phải là quá lớn.

Một cách tiếp cận khác sẽ là viết nó như một proc được lưu trữ mà có lẽ sẽ làm cho DBA của bạn hạnh phúc.

+0

nếu tất cả các thông số không phải là rỗng, tôi có nghĩa là nếu tất cả các điều kiện đúng mà phải cho tôi một câu trả lời được lọc. Đối với điều kiện tiếp cận 1 này là đủ để có được giá trị. – blackraist

6

Bạn có thể có cốt lõi của câu hỏi của bạn như sau:

var query = from r in db.requests 
select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products 
         where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        } 

Sau đó áp dụng if then else:

if (!string.IsNullOrEmpty(departmant)) 
    return query.Where(r=>r.departmant== departmant).ToList(); 
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
{ 
     DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
     DateTime dtlastDate = Convert.ToDateTime(lastDate); 
     return query.Where(r=> r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate) 
        .ToList(); 
} 

Nó không làm giảm if then else nhưng làm cho hợp lý hơn, những gì sẽ xảy ra.

+0

@Jani, Salam pesar, kojaee? bia quá google talk :) –

+1

+1 cho câu trả lời tuyệt vời của bạn !!!! Avariin :-) – hsalimi

+0

cũng thực sự, tôi cần phải xem xét rất nhiều điều kiện để có được giá trị ... Danh sách công cộng GetRequestsQuery (chuỗi departmant, int reqStateID, chuỗi firstDate, chuỗi lastDate, string productName) ....tôi có nghĩa là nếu tất cả các điều kiện đúng mà phải cho tôi một câu trả lời lọc. Hoặc một trong số họ là đúng, phần còn lại là sai ... vì vậy tôi cần phải viết tất cả các khả năng? nếu (a & b & c & d) khác nếu (a & b & c) khác nếu (a & c & d) khác nếu (b & c & d) khác nếu (a & b) khác nếu (a & c) ... etc ?? :))) – blackraist

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