"无效的条件"当我尝试使用LINQ搜索CRM 2011中忽略重音的重音值时

时间:2015-01-23 18:59:18

标签: c# linq dynamics-crm-2011 crm

我正在尝试搜索联系人。例如,值“Café”存储在名称字段中,但是当我搜索“cafe”时不会返回任何记录。

我尝试了以下

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
     {
       var query_where3 = from c in svcContext.ContactSet
                         join a in svcContext.AccountSet
                         on c.ContactId equals a.PrimaryContactId.Id
                         where c.FullName.Normalize(NormalizationForm.FormD).Contains("Café")
                         select new
                         {
                          account_name = a.Name,
                          contact_name = c.LastName
                         };
}

并显示带有消息的异常“无效'where'条件。实体成员正在调用无效的属性或方法”

4 个答案:

答案 0 :(得分:0)

一切都是关于

.Normalize(NormalizationForm.FormD)

,可能EF不知道如何处理这种方法。删除它并使用

进行测试
c.FullName.Contains("Café")

----------------------------------------------- - 在2015-01-30添加----------------------------------------- ---------

那么男人,我能想到的独特解决方案是在你做where条件之前列出的。这样,一旦这将由linq 2对象处理,您可以使用normalize。试试:

(from c in svcContext.ContactSet join a in svcContext.AccountSet
on c.ContactId equals a.PrimaryContactId.Id 
select new {a=a,c=c}    ).ToList()
.Where(c=>c.FullName.Normalize(NormalizationForm.FormD).Contains("Café"))
.Select( x=> select new  {
                          account_name = x.a.Name,
                          contact_name = x.c.LastName
                         };)

但是这种方式会导致一些开销,因为linq 2 obejects在应用服务器内存中运行,而不是在数据库服务器中运行。

答案 1 :(得分:0)

您无法在LinQ-CRM上使用该功能,执行查询的正确方法是:

c.FullName == "someString" or c.FullName.equals("someString").

这是因为您无法在左侧条件下使用函数或转换。您必须使用该属性本身。

您的查询将如下所示:

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
     {
       var query_where3 = from c in svcContext.ContactSet
                         join a in svcContext.AccountSet
                         on c.ContactId equals a.PrimaryContactId.Id
                         where c.FullName == "Café" || c.FullName == "Cafe"
                         select new
                         {
                          account_name = a.Name,
                          contact_name = c.LastName
                         };
}

答案 2 :(得分:0)

一般情况下,您无法真正处理Linq to SQL的重音......而您对使用Linq to CRM所做的工作更加有限。你不能修改数据库;除非你不关心得到支持。然后你可以做类似的事情:MAD建议和db改变。

ALTER TABLE Name ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI

我个人不建议这样做。

我能想到的最好的方法是尽可能地获取数据,然后从列表或类似内容中过滤数据。 我必须一直这样做,这是一个痛苦(并增加了更多的开销),但我找不到真正的另一种解决方法。

    //declare a dictionary 
    Dictionary<string, string> someDictionary = new Dictionary<string, string> ();


    using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
     {
       var query_where3 = from c in svcContext.ContactSet
                         join a in svcContext.AccountSet
                         on c.ContactId equals a.PrimaryContactId.Id
                         where  c.FullName.Contains("Caf")
                         select new
                         {
                          account_name = a.Name,
                          contact_name = c.LastName
                         };
}
//then
    foreach(var q in query_where3)
    {
        if(string.IsNullOrEmpty(account_name)==false && string.IsNullOrEmpty(contact_name)==false)
    {
        someDictionary.Add(account_name, contact_name);
    }
    }

//then you can add the .Normalize(NormalizationForm.FormD) to your dictionary

希望有所帮助。

答案 3 :(得分:-1)

CRM的LINQ翻译器无法处理.Equals()方法。

on c.ContactId equals a.PrimaryContactId.Id

将上一行更改为以下行。

on c.ContactId == a.PrimaryContactId.Id