2016-06-10 3 views
2

Я хочу, чтобы запустить динамическое LINQ строкой, где положение так:C# DynamicLinq, где положение с любой()

query = db.Customers.Where("Categories.Any(Code == 'Retail')"); 

объект Клиент имеет коллекцию категории

class Customer 
{ 
    public List<Category> Categories {get;set;} 
    ... 
} 

class Category 
{ 
    public Guid Id {get;set;} 
    public string Code {get;set;} 
} 

Может кто-нибудь пожалуйста, скажите мне возможно ли сделать что-то подобное?

PS: Мне нужно, чтобы предложение было строкой. Предложение where будет генерироваться во время выполнения, поэтому я не могу использовать выражение запроса Linq.

Я использую Telerik DataAccess.

+0

Каковы возможные варианты динамического пункта, вы имеете в виду код не фиксируется или целое состояние? Можете ли вы дать пару более разных примеров? – user3185569

+1

Для этого можно использовать ['Expression'] (https://msdn.microsoft.com/en-us/library/ms173144.aspx). Вероятно, вам нужен какой-то строитель, чтобы построить строковый запрос в дереве выражений. –

+0

Какая версия EF вы используете? – Hamed

ответ

3

Это возможно, как только вы будете следовать правилам Expression Language.

Например, строковые литералы должны быть заключены в двойные кавычки:

query = db.Customers.Where("Categories.Any(Code == \"Retail\")"); 
1

Разве это не должно быть ниже?

refinedCustomerList = db.Customers.Where(customer => customer.Categories.Any(Code == 'Retail')); 

, приведенный выше список будет содержать все клиент, чьи категория 'Retail'

1

Вам нужно что-то вроде этого:

query = db.Customers.Where(x => x.Categories.Where(y => y.Code == "Retail").Any()); 
+0

I нужно, чтобы предложение было строкой. – Daler

+0

@ Далер по какой причине? – Sherlock

+0

Поскольку это не предопределено, предложение будет сгенерировано во время выполнения. – Daler

2

Вы можете создать свое собственное выполнение Expression:

Expression<Func<Customer, bool>> myRuntimeExpression = null; 

if(condition1) 
{ 
    myRuntimeExpression = cust => cust.Categories.Any(cat => cat.Code == "Retial"); // or some local variable 
} 
else if(condition2) 
{ 
    myRuntimeExpression = cust => cust.Categories.Any(cat => cat.Id = someId) == false; 
} 
else if(condition3) 
{ 

} 

var query = DB.Customers.Where(myRuntimeExpression); 

Однако, если вам нужно построить более сложные запросы, посмотрите на Dynamic Queries in Linq Using Expressions.

1

linq extention method were принял аргумент типа System.Func<TSource, Int32, Boolean>

  • В вашем случае Func что recieves в Customer в качестве аргумента и возвращает истина/ложь.
    Результатом функции Where будет все Customers, что Func возвращен true для.

"Categories.Any(Code == 'Retail')" является строка, а не Func, таким образом, не может быть передан в качестве аргумента метода Where.

Возможно, что вы ищете, если вы хотите сохранить запрос гибок некоторые вещи, как:

Public Customer[] QueryCustomers(Func<Customer,bool> predicate) 
{ 
    var result = db.Customers.Where(c=> predicate(c)).ToArray(); 
    return result; 
} 

Использование:

var retailCustomers = 
     QueryCustomers(customer => customer.Categories.Any(Code == 'Retail')) 

Или любой другой запрос вы можете составить в перспективе/время компиляции:

var customersWithNoCategories = 
     QueryCustomers(customer => customer.Categories.Count == 0) 
Смежные вопросы