如何在C#LINQ中拆分字符串?

时间:2018-10-05 21:40:49

标签: c# linq

我有这个

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中实现该功能?

谢谢

3 个答案:

答案 0 :(得分:0)

EF不支持

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());
}