вопрос об использовании PredicateExtensions для создания sqlscriptes - PullRequest
0 голосов
/ 04 июля 2011

вот мой логический код:

var predicate = PredicateExtensions.False<Customer>();
predicate = predicate.Or(p => p.CustomerID.Contains("N"));

using (Entities e = new Entities())
{
    var r = from p in e.Customer.AsQueryable().Where(predicate.Compile())
            select p;
    foreach (var _r in r)
        Console.WriteLine(_r.CustomerID);
}

, а затем я использую SQL Server Profiler для получения сценариев SQL, как это:

SELECT 
[Extent1].[CustomerID] AS [CustomerID], 
[Extent1].[Custname] AS [CustEname], 
[Extent1].[Site] AS [DefaultSite], 
[Extent1].[Currency] AS [Currency], 
[Extent1].[PayTerm] AS [PayTerm], 
[Extent1].[BAddr1] AS [BillAddr1], 
[Extent1].[BAddr2] AS [BillAddr2], 
[Extent1].[BAddr3] AS [BillAddr3], 
[Extent1].[BContact] AS [BillContact], 
[Extent1].[BTel] AS [BillTel], 
[Extent1].[BFax] AS [BillFax], 
[Extent1].[BEMail] AS [BillEMail], 
[Extent1].[Company] AS [DlvyCompany], 
[Extent1].[Addr1] AS [DlvyAddr1], 
[Extent1].[Addr2] AS [DlvyAddr2], 
[Extent1].[Addr3] AS [DlvyAddr3], 
[Extent1].[Contact] AS [DlvyContact], 
[Extent1].[Tel] AS [DlvyTel], 
[Extent1].[Fax] AS [DlvyFax], 
[Extent1].[EMail] AS [DlvyEMail], 
[Extent1].[Remark] AS [Remark], 
[Extent1].[User] AS [User], 
[Extent1].[DT] AS [UpdateDT]
FROM [dbo].[Customer] AS [Extent1]

, что я получаю все данные из моей базы данных, но я надеюсь, что в конце сценариев sql есть условие, значит получить все данные, но customeid содержит N(p => p.CustomerID.Contains("N"))

, где я ошибаюсь .... пожалуйста, дайте несколько очков.!

1 Ответ

0 голосов
/ 04 июля 2011

Проблема заключается в методе Compile(). Методы расширения IQueryable<T>, которые вы хотите использовать, требуют в качестве аргументов выражения. Вызов AsQueryable() ничего не делает в вашем случае, и вызывается метод расширения IEnumerable<Customer> Where(Func<Customer, bool>). Вы хотите вместо этого вызвать IQueryable<Customer> метод расширения Where(Expression<Func<Customer, bool>>). Сделать это просто: просто не вызывайте Compile(), predicate уже является выражением. Кроме того, способ, которым вы используете выражение запроса (from …), ничего не делает (почти), поэтому вы можете его опустить:

var r = e.Customer.Where(predicate);
...