Совпадение символов в запросе LINQ - PullRequest
0 голосов
/ 22 ноября 2011

Я пытаюсь сопоставить первые 5 символов почтового индекса в запросе LINQ, и для этого я использую SubString. Сначала я проверяю, является ли какое-либо из значений NULL, чтобы оно не получалось из этого. Это код, который я использую, но я получаю сообщение об ошибке:

var lQuery = (from a in gServiceContext.CreateQuery("account")
    let AccountName = !a.Contains("name") ? string.Empty : a["name"]
    let Zip = !a.Contains("address1_postalcode") ? string.Empty : a["address1_postalcode"]
    let State = !a.Contains("address1_stateorprovince") ? string.Empty : a["address1_stateorprovince"]
    let Address = !a.Contains("address1_line1") ? string.Empty : a["address1_line1"]
    let City = !a.Contains("address1_city") ? string.Empty : a["address1_city"]
       where String.IsNullOrEmpty(Zip.ToString()) || String.IsNullOrEmpty(lLead.ZipCode) ? false : Zip.ToString().Substring(0,5).Equals(lLead.ZipCode.Substring(0,5))
       select new
       {
          Name = AccountName
       });
int c = lQuery.ToList().Count();

Я получаю ошибку:

«Метод« Где »не может следовать за методом« Выбрать »или не поддерживается. Попробуйте написать запрос в терминах поддерживаемых методов или вызвать метод« AsEnumerable »или« ToList »перед вызовом неподдерживаемых методов."

Какие-нибудь идеи о том, как обойти это или предложения о лучшем подходе?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Вы можете упростить некоторые из логики.С моей стороны это работает над макетом вашего результирующего набора как IEnumerable<Dictionary<string,string>>, поэтому я думаю, он будет работать с вашими данными, не зная, какой тип возвращается из gServiceContext.CreateQuery ():

var lQuery = (from a in gServiceContext.CreateQuery("account")
                let AccountName = a.Contains("name") ? a["name"] : String.Empty
                let Zip = a.Contains("address1_postalcode") ? a["address1_postalcode"] : String.Empty
                where  Zip.Substring(0, 5).Equals(lLead.ZipCode.Substring(0, 5))
                select new
                            {
                                Name = AccountName
                            });

Вы можететакже вызовите .Count () для lQuery напрямую.Это позволяет реализации LINQ выбрать наиболее эффективный способ подсчета результатов, а не загружать весь набор результатов в память и использовать LINQ to Objects для доступа к свойству .Count списка, возвращаемого из .ToList ().

int c = lQuery.Count();
0 голосов
/ 22 ноября 2011

Так что некоторые методы не поддерживаются в Linq to Entities, поэтому вам нужно будет поместить их в память и выполнить там действия:

var lQuery = (from a in gServiceContext.CreateQuery("account")
    let AccountName = !a.Contains("name") ? string.Empty : a["name"]
    let Zip = !a.Contains("address1_postalcode") ? string.Empty : a["address1_postalcode"]
    let State = !a.Contains("address1_stateorprovince") ? string.Empty : a["address1_stateorprovince"]
    let Address = !a.Contains("address1_line1") ? string.Empty : a["address1_line1"]
    let City = !a.Contains("address1_city") ? string.Empty : a["address1_city"]
    select new 
    {
        AccountName, 
        Zip, 
        State, 
        Address, 
        City, 
        a.lLead
    }).AsEnumerable()
    .Where(i => String.IsNullOrEmpty(i.Zip.ToString()) || String.IsNullOrEmpty(i.lLead.ZipCode) ? false : i.Zip.ToString().Substring(0,5).Equals(i.lLead.ZipCode.Substring(0,5))
    .Select(i => new
    {
        Name = i.AccountName
    });

Сгенерированный SQL будет выглядеть примерно так::

    Select name... as AccountName, address1_city as City, etc
    From account

, поэтому, если вы заметили, что предложение where отсутствует, то есть возвращаются все строки из учетной записи таблицы.

Некоторая фильтрация

var lQuery = (from a in gServiceContext.CreateQuery("account")
    let AccountName = !a.Contains("name") ? string.Empty : a["name"]
    let Zip = !a.Contains("address1_postalcode") ? string.Empty : a["address1_postalcode"]
    let State = !a.Contains("address1_stateorprovince") ? string.Empty : a["address1_stateorprovince"]
    let Address = !a.Contains("address1_line1") ? string.Empty : a["address1_line1"]
    let City = !a.Contains("address1_city") ? string.Empty : a["address1_city"]
    where Zip != null 
          && Zip != string.Empty 
          && lLead.ZipCode != null 
          && lLead.ZipCode != string.Empty 
          && Zip.Contains(lLead.ZipCode)
    select new 
    {
        AccountName, 
        Zip, 
        State, 
        Address, 
        City, 
        a.lLead
    }).AsEnumerable()
    .Where(i => i.Zip.ToString().Substring(0,5).Equals(i.lLead.ZipCode.Substring(0,5))
    .Select(i => new
    {
        Name = i.AccountName
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...