我有这个
from d in db.v_Report_CompanySearches
orderby d.InquiryLogID descending
where (mPersonName == null || d.AccountName.ToLower() == mPersonName || d.PersonName.ToLower() == mPersonName) &&
(mCompanyName == null || TagsContain(d.CompanySearchTerm, mCompanyName)) &&
d.CreateDT >= mFrom && d.CreateDT <= mTo
select (d);
和
private bool TagsContain(string terms, string val)
{
string[] tags = terms.ToLower().Split(';');
return tags.Contains(val.ToLower());
}
,但它与not supported error
一起崩溃。我认为这是因为我使用的是自定义函数TagsContain
。没有自定义内容,如何在linq中实现该功能?
谢谢
答案 0 :(得分:0)
Id TagsContain
,它具有基础的SQL函数,它将崩溃。这就是这里正在发生的事情。
这应该起作用:
from d in db.v_Report_CompanySearches
orderby d.InquiryLogID descending
where (mPersonName == null || d.AccountName.ToLower() == mPersonName || d.PersonName.ToLower() == mPersonName) &&
(mCompanyName == null || d.CompanySearchTerm.Contains(mCompanyName)) &&
d.CreateDT >= mFrom && d.CreateDT <= mTo
select (d);
答案 1 :(得分:0)
提供程序无法将您的自定义函数转换为sql。而且我担心split是不支持生成sql的功能之一。
您可以在没有read
.Split
答案 2 :(得分:0)
法比奥所说的是对的。 c#的split函数无法转换为SQL查询。所以,这里有一种方法
从DB中获取所有值到C#List对象中,然后在其上应用拆分过滤器。
var myListObject = (from d in db.v_Report_CompanySearches
orderby d.InquiryLogID descending
where (mPersonName == null || d.AccountName.ToLower() == mPersonName || d.PersonName.ToLower() == mPersonName) &&
d.CreateDT >= mFrom && d.CreateDT <= mTo
select (d)).ToList();
然后
var afterFilterObject = myListObject.Where(d => (d.mCompanyName == null || TagsContain(d.CompanySearchTerm, mCompanyName))).ToList();
要调用的方法
private bool TagsContain(string terms, string val)
{
string[] tags = terms.ToLower().Split(';');
return tags.Contains(val.ToLower());
}