2015-07-28 4 views
0

Предположим, мне нужно создать пользовательское выражение, чтобы сделать некоторые манипуляции с IQueryable<x> и IQueryable<y>. К сожалению, у меня нет идеи, как это реализовать. Это моя попытка:
Пользовательское расширение LINQ для make join

public static IQueryable<T> JoinQueries<T>(this IQueryable<T> query, IQueryable<T> expr) 
     { 
      if (query == null) 
       throw new ArgumentNullException("query"); 
      //Here we make Join for x and and return result something like this: 
      query = from a in query join b in expr on a.Id equals b.Id select a; 
      return query; 
     } 

Или сказать другие слова, которые мне нужны результат:

IQueryable <somevalue> x = query.CustomJoinExtension(Iqueryablevalue); 
+0

Я бы предположил, 'expr' должен быть' Выражение > '. Для доступа к 'Id' вам нужно использовать общее ограничение' where T: SomeEntity' –

+0

Вы хотите объединить два разных запроса в одном типе? Или я чего-то не понял? –

+0

@CallumLinington, спасибо, можете ли вы представить простой пример, пожалуйста, я новичок в использовании расширений и выражений. –

ответ

1

Что-то вроде этого:

public static IQueryable<T> JoinQueries<T> 
(this IQueryable<T> query, IQueryable<T> expr) where T : IHasId 
{ 
    if (query == null) 
     throw new ArgumentNullException("query"); 
    //Here we make Join for x and and return result something like this: 
    query = from a in query join b in expr on a.Id equals b.Id select a; 
    return query; 
} 

public interface IHasId 
{ 
    int Id { get; set; } 
} 
+0

, если это предназначено для использования в Entity Framework, ограничение класса должно содержать «класс», иначе EF не сможет понять запрос: http://stackoverflow.com/a/21172754/1117815 – felipe