2010-05-01 4 views
3

я хочу передать параметр запроса Linq ...как я могу передать параметр в Linq запрос

public IEnumerable GetPhotos() 
{ 
    PhotoDBDataContext db = new PhotoDBDataContext(); 
    var query = from p in db.Photos 
       orderby p.PhotoId descending 
       select new { p.Album, p.AlbumId, p.Description, p.Photographer, 
          p.PhotographerId, p.PhotoId, p.Tags, p.Thumbnail, 
          p.Url }; 
    return query; 
} 

в приведенном выше примере «OrderBy p.PhotoId по убыванию» используется, я хочу использовать параметр вместо p.PhotoId

возможно ...

+0

Параметр 'выбрать новый {...}', кажется довольно исчерпывающим. Вы действительно выбираете подмножество всех столбцов? Если нет, вы можете просто написать 'select p'. –

+0

Вы не используете 'tProduct' где угодно. В чем его цель? –

+0

См. Http://stackoverflow.com/questions/2747114/linq-to-entities-dynamic-sorting/2747641#2747641 – Steven

ответ

3
public IQueryable<Photo> GetPhotos(PhotoDBDataContext db, string orderBy) 
{ 
    var query = from p in db.Photos select p; 
    switch (orderBy) { 
     case "PhotoId": 
      return query.OrderBy(p => p.PhotoId); 
     case "AlbumId": 
      return query.OrderBy(p => p.AlbumId); 
     default: 
      // Error handling. 
    } 
} 

Обратите внимание, что вы не должны возвращать объекты с анонимным типом.

+0

можно ли использовать здесь выражение lamda? – girish

1

С Dynamic Linq вы можете написать .OrderBy("ColumnName").

+0

+1 для динамического linq и 5-го варианта использования DL, который я видел здесь за последние 24 часа. –

+0

Да, в последнее время было довольно много вопросов о сортировке запросов LINQ. – Steven

0

Вы могли бы сделать это так, если у вас два порядка по критериям-

public static IQueryable<Photo> GetPhotos(string OrderBy) 
    { 
     return db.Photos.OrderBy(p => ((OrderBy == "PhotoId") ? (p.PhotoId) : (p.AlbumId))); 
    } 
0

Вы можете использовать расширение. Это помогло мне:

public static class OrderExt 
    { 
     public static IOrderedQueryable<T> Order<T>(this IQueryable<T> source, string propertyName, SortDirection descending, bool anotherLevel = false) 
     { 
      var param = Expression.Parameter(typeof(T), string.Empty); 
      var property = Expression.PropertyOrField(param, propertyName); 
      var sort = Expression.Lambda(property, param); 

      var call = Expression.Call(
       typeof(Queryable), 
       (!anotherLevel ? "OrderBy" : "ThenBy") + 
       (descending == SortDirection.Descending ? "Descending" : string.Empty), 
       new[] { typeof(T), property.Type }, 
       source.Expression, 
       Expression.Quote(sort)); 

      return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call); 
     } 
    } 

Для полного объяснения можно пойти: http://how-to-code-net.blogspot.ro/2014/04/how-to-call-for-dynamic-orderby-method.html

Смежные вопросы