我正在尝试搜索联系人。例如,值“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'条件。实体成员正在调用无效的属性或方法”
答案 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