2010-07-09 40 views
6

Tôi đang sử dụng giao diện tôi tìm thấy, trong đó có phương thức nhận biểu thức LINQ làm tham số. Làm cách nào để triển khai phương pháp này để sử dụng Biểu thức LINQ? Tôi có thể thấy nó rất hữu ích, nhưng không làm thế nào để viết mã để sử dụng nó !!Thực hiện tham số LINQ Expression

Giao diện kho lưu trữ của nó.

chữ ký là ...

IQueryable<T> Get(Expression<Func<T, bool>> criteria); 
+3

Bạn có nghĩa là bạn muốn viết phương thức của riêng bạn chấp nhận Biểu thức làm tham số? Hoặc bạn muốn sử dụng một methond hiện có trên giao diện của người khác? – Rup

+0

Tôi muốn viết phương thức chấp nhận Biểu thức dưới dạng tham số. Thx Rup – SteveCl

+1

Tôi đang bối rối; chữ ký mà bạn đã hiển thị * biểu thị * cách chấp nhận 'Biểu thức' như một tham số ... –

Trả lời

9

Có vẻ như bạn đang tìm kiếm nội dung như thế này:

List<T> myList = new List<T>(); 
... 
public IQueryable<int> Get(Expression<Func<int, bool>> criteria) 
{ 
    return myList.Where(criteria.Compile()).AsQueryable(); 
} 

Điều này chuyển biểu thức của bạn criteria sang phương thức linq Where. Sau đó, bạn có thể gọi nó như sau:

foreach(var something in myClass.Get(o => o.someProperty == 10)) 
{ 
    ... 
} 

Tất nhiên, điều này khá ngu ngốc; sẽ tốt hơn nếu chỉ triển khai IEnumerable<T> ...

+0

cảm ơn, biết nó sẽ là một cái gì đó đơn giản !!! :) – SteveCl

1

Đó là một biểu ngữ; một cái gì đó cho biết dữ liệu để bao gồm.

Vì vậy, để có được một hồ sơ duy nhất bạn có thể sử dụng:

int rowId = 123; 
var row = foo.Get(x => x.Id == rowId).Single(); 

Hoặc để có được tất cả các dữ liệu phù hợp với một số điều kiện bạn có thể sử dụng:

var allDeleted = foo.Get(x => x.IsDeleted).ToList(); 

Lưu ý rằng điều này nên được composable, để biết thêm vui vẻ:

var today = from row in foo.Get(x => x.DateCreated > DateTime.Today) 
      orderby row.Name 
      select new {row.Id, row.Name}; 
+0

Thx Mark, tôi đồng ý với việc sử dụng các biến vị ngữ, tôi chỉ không biết cách viết phương thức chấp nhận biến vị ngữ. Thx – SteveCl

6

IQueryable<T> có thông sốmất tham số Expression<Func<T>>. Khi giả định rằng đây là một kho lưu trữ Linq2Sql hoặc Linq2Entities, một cái gì đó như thế này nên làm việc

class MyRepository 
{ 
    ObjectContext context = // initialize somehow; 


    public IQueryable<int> Get(Expression<Func<int, bool>> predicate) 
    { 
     return context.SomeObject.Where(predicate); 
    } 
} 

Nếu đó không phải là trường hợp, và bạn chỉ có một đếm được, bạn có thể sử dụng AsQuerably() như là bước đầu tiên trong chuỗi để chuyển đổi nó tới IQuerably, cung cấp cho bạn tùy chọn sử dụng biến vị ngữ dựa trên biểu thức:

public IQueryable<int> Get(Expression<Func<int, bool>> predicate) 
{ 
    return mySimpleList.AsQuerable().Where(predicate); 
} 
+0

Cảm ơn, tôi đã trao tiền thưởng cho BlueRaja, chỉ vì đó là câu trả lời đầu tiên ... cảm ơn, nó rất hữu ích – SteveCl

+0

Tôi nghĩ (không chắc chắn 100%) rằng '.Compile' theo sau là' .AsQueryable' hiệu suất kém hơn rất nhiều nếu bạn đang sử dụng cơ sở dữ liệu. Với linq2sql hoặc linq2entities tôi nghĩ rằng nó sẽ lấy tất cả và thực hiện biến vị ngữ trong C# thay vì trong SQL. –

+0

Đây chắc chắn là câu trả lời đúng .... – Pluc

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