2013-06-14 3 views
1

У меня есть приложение Linq, и мне нужно получить динамическое выражение. Я использую класс:динамический linq где выражение

public class EntityColumnsField 
{ 
    public String ColumnName { get; set; } 
    public Type ColumnType { get; set; } 
    public bool IsPK { get; set; } 
    public String TableName { get; set; } 
    public Type TableType { get; set; } 
} 

я получить список столбцов Entity методом:

public static IEnumerable<EntityColumnsField> GetAllColumnsFromEntity(params EntityObject[] entities) 
    { 
     if (entities == null || entities.Count() == 0) 
      throw new ArgumentNullException("entity"); 

     List<EntityColumnsField> ColumnList = new List<EntityColumnsField>(); 

     foreach (var entity in entities) 
     { 
      ColumnList.AddRange(from p in entity.GetType().GetProperties() 
           where p.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false).Any() 
           select new EntityColumnsField() 
           { 
            TableName = entity.GetType().Name, 
            ColumnName = p.Name, 
            ColumnType = p.PropertyType, 
            IsPK = p.GetCustomAttributes(false).Where(a => a is EdmScalarPropertyAttribute && ((EdmScalarPropertyAttribute)a).EntityKeyProperty).Count() > 0 
           }); 
     } 
     return ColumnList.OrderBy(a => a.TableName); 
    } 

чем у меня есть 3 таблицы (User, UserPartner и UserFriends) и мне нужно генерировать где условия для всех строки поля. Я пытаюсь сделать это следующим образом:

using (var db = new DB()) 
      { 
       var ll = from x in db.Users 
         join y in db.UserPartners on x.ID equals y.ID 
         join z in db.UserFriends on x.ID equals z.ID 
         select new { Users = x, UserPartners = y, UserFriends = z }; 
      } 
if (!String.IsNullOrEmpty(fulltext)) 
{ 
var AllSearchField = Utils.GetAllColumnsFromEntity(new User(), new UserPartner(), new UserFriends()); 
//TODO: 
//Here i need a code, which generate predicate for all text fields in tables 
//the result would be like : 
//ll.Where(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText)) 
} 

Кто-нибудь знает, как это сделать? Thanks

+0

выглядит как вы пытаетесь реализовать полнотекстовый поиск, Вы рассмотрели существующие реализации - как SQL сервер полнотекстового поиска или Lucene? – Giedrius

+0

вам может понадобиться что-то вроде этого: foreach (var source in ll.Where (a => a.Users.Address.Contains (fulltext) || a.Users.Email.Contains (fulltext) || a.UserPartners. Email.Contains (m.FullText))) { // сделать что-то с источником } – Jegan

+0

Возможно, это может помочь u; http://stackoverflow.com/questions/2455659/how-to-use-contains-or-like-in-a-dynamic-linq-query – CocLn

ответ

1
+0

Это хорошая идея, но проект не может использовать сторонние библиотеки – Davecz

+0

Я не уверен, может ли MS Code рассматриваться как сторонний. – kazimanzurrashid

+0

это всего лишь файл .cs, вы можете включить в свое решение .. – Amit

0

вам может понадобиться что-то вроде этого,

var ll; 
using (var db = new DB()) 
{ 
    ll = from x in db.Users 
      join y in db.UserPartners on x.ID equals y.ID 
      join z in db.UserFriends on x.ID equals z.ID 
      select new { Users = x, UserPartners = y, UserFriends = z }; 
} 

if (!String.IsNullOrEmpty(fulltext)) 
{ 
    var AllSearchField = Utils.GetAllColumnsFromEntity(new User(), new UserPartner(), new UserFriends()); 
    //TODO: 
    //Here i need a code, which generate predicate for all text fields in tables 
    //the result would be like : 
    foreach (var source in ll.Where(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText))) 
    { 
     // do something with source  
    } 
} 

можно также использовать функцию FindAll

foreach (var source in ll.FindAll(a => a.Users.Address.Contains(fulltext) || a.Users.Email.Contains(fulltext) || a.UserPartners.Email.Contains(m.FullText))) 
    { 
     // do something with source  
    } 
1

Попробуйте так:

System.Linq.Dynamic 1.0.0 

Это сборка Microsoft для .Net 4.0 Dynamic language функциональности.

System.Linq.Dynamic Для установки, выполните следующую команду в Package Manager Console

PM> Install-Package System.Linq.Dynamic 
Смежные вопросы