2014-02-06 3 views
0

Это мои объекты:Linq где с вложенными .any() в строке переменной

public class Subscription : BaseItem 
    { 
     public virtual DateTime DateStart { get; set; } 
     public virtual DateTime? DateEnd { get; set; } 
     public virtual int Status { get; set; } 
     public virtual Account Account { get; set; } 
     public virtual Theater Theater { get; set; } 
     public virtual Agent Agent { get; set; } 
    } 

public class Account : BaseItem 
    { 
     public virtual string LegalName { get; set; } 
     public virtual string FirstName { get; set; } 
     public virtual string UrlName { get; set; } 
     public virtual string Address1 { get; set; } 
     public virtual string Address2 { get; set; } 
     public virtual string City { get; set; } 
     public virtual string State { get; set; } 
     public virtual string ZipCode { get; set; } 
     public virtual string Country { get; set; } 
     public virtual string Tel { get; set; } 
     public virtual string Tel2 { get; set; } 
     public virtual string Fax { get; set; } 
     public virtual string Mobile { get; set; } 
     public virtual string Email { get; set; } 
     public virtual string Website { get; set; } 
     public virtual int DefaultVatRate { get; set; } 
     public virtual bool Bankrupt { get; set; } 
     public virtual string ExternalId { get; set; } 
     public virtual bool DoNotContact { get; set; }  
     public virtual bool NotInterested { get; set; }  
     public virtual Group Group { get; set; } 
     public virtual IList<Header> Headers { get; set; } 
     public virtual IList<Note> Notes { get; set; } 
     public virtual IList<Order> Orders { get; set; } 
     public virtual IList<Subscription> Subscriptions { get; set; } 
    } 

public class Order : BaseItem 
    { 
     public virtual int Number { get; set; } 
     public virtual DateTime Date { get; set; } 
     public virtual string Description { get; set; } 
     public virtual double Amount { get; set; } 
     public virtual string Attachment { get; set; } 
     public virtual string AttachmentFilename { get; set; } 
     public virtual string AttachmentMimetype { get; set; } 
     public virtual bool? PaidToTheater { get; set; } 
     public virtual DateTime? DatePaidToTheater { get; set; } 
     public virtual bool? CashinByTheater { get; set; } 
     public virtual Account Account { get; set; } 
     public virtual Theater Theater { get; set; } 
     public virtual Agent Agent { get; set; } 
     public virtual IList<Invoice> Invoices { get; set; } 
     public virtual IList<OrdersAttachment> OrdersAttachments { get; set; } 
     public virtual IList<OrdersDueDate> OrdersDueDates { get; set; } 
     public virtual Header Header { get; set; } 
    } 

public class Invoice : BaseItem 
    { 
     public virtual int Number { get; set; } 
     public virtual DateTime Date { get; set; } 
     public virtual double Amount { get; set; } 
     public virtual double VatRate { get; set; } 
     public virtual bool IsDisabled { get; set; } 
     public virtual bool IsSendMail { get; set; } 
     public virtual Order Order { get; set; } 
     public virtual IList<InvoicesDueDate> InvoicesDueDates { get; set; } 
     public virtual IList<InvoicesPayment> InvoicesPayments { get; set; } 
    } 

У меня есть метод в моей программе, построить «запрос» в строковой переменной.

private string GenerateQuery(FilterSubscription filterSubscription) 
{ 
    if (filterSubscription.FilterByOrder) 
     return "Account.Orders.Any()"; 
    if (filterSubscription.FilterByInvoice) 
     return "Account.Orders.Any(Invoices.Any())"; //here is my problem 
} 

Это вызов метода

string query = GenerateQuery(filterSubscription) 
var count = Session.Linq<Subscription>().Where(query).Count(); 

Если мне нужно извлечь все учетные записи, которые имеют по крайней мере один заказ все в порядке. Но если мне нужно извлечь все учетные записи, у которых есть хотя бы один счет-фактура, я не знаю, как это сделать. Если бы я писал

var count = Session.Linq<Subscription>().Where(s=>s.Account.Orders.Any(o=>o.Invoices.Any())).Count(); 

это работает, но если я использую строку переменной нет.

+1

Что происходит именно? вы получаете сообщение об ошибке? –

+0

@ThomasLevesque при вызове метода .Count() со строкой «Account.Orders.Any (Invoices.Any())« Я получаю ** ArgumentOutOfRangeException **. Вместо этого с строкой «Account.Orders.Any (o => o.Invoices.Any())», я получаю ** ParseException ** с сообщением «Нет свойства или поля« o »существует в типе« Заказ » – Albirex

+0

Кстати, вы отметили свой вопрос «инфраструктура сущности», но «Session.Linq» - это что-то из NHibernate ... Я пробовал свой код с данными в памяти, и он отлично работает, поэтому может быть что-то не так с NHibernate –

ответ

1

Похоже, вы должны вернуть делегат от GenerateQuery вместо этого - что-то вроде:

private Expression<Func<Subscription, bool>> GenerateQuery(FilterSubscription filterSubscription) 
{ 
    if (filterSubscription.FilterByOrder) 
    return s => s.Account.Orders.Any(); 
    if (filterSubscription.FilterByInvoice) 
    return s => s.Account.Orders.Any(o => o.Invoices.Any()); 
} 

Тогда просто обновить переменный запрос неявным напечатал:

var query = GenerateQuery(filterSubscription); 
+0

Я подозреваю, что он используя Dynamic Linq, который позволяет использовать предикат строки –

+0

В любом случае, метод должен возвращать 'Expression >', а не 'Func ' –

+0

Thanks @ThomasLevesque - отредактирован для возврата вместо этого. Я бы предпочел использовать выражения для динамического Linq для предопределенных запросов для сбора ошибок во время компиляции, могут быть и другие причины, по которым это невозможно в этом случае. –

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