【发布时间】:2019-08-29 04:35:49
【问题描述】:
所以我想为我的数据制作一个通用分类器。我有这段代码可以从数据库中获取数据,它将仅提取包含 value 的数据。
using System.Linq.Dynamic;
public static IQueryable<object> SortList(string searchString, Type modelType,
IQueryable<object> model)
{
....
string toStringPredicate = type == typeof(string) ? propertyName +
".Contains(@0)" : propertyName + ".ToString().Contains(@0)";
model = model.Where(propertyName + " != NULL AND " + toStringPredicate, value);
}
型号是这样的:
public class ManageSubscriberItems
{
public int? UserId { get; set; }
public string Email { get; set; }
public Guid SubscriberId { get; set; }
}
当我打电话时:
models = (IQueryable<ManageSubscriberItems>)EcommerceCMS.Helpers.FilterHelper
.SortList(searchString, typeof(ManageSubscriberItems), models);
if(models.Any())
它会抛出这个错误:
"LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且这个方法不能翻译成store 表达。”
编辑
我找到了问题,但我仍然无法解决它。所以如果属性不是string,调用.ToString().Contains()时会抛出错误。
model = model.Where(propertyName + " != NULL AND " + propertyName +
".ToString().Contains(@0)", value);
我想要的是在查询中实现LIKE。谁能帮帮我?
【问题讨论】:
-
看看docs.microsoft.com/en-us/dotnet/api/…,我认为你不能在 LinQ 或 EF 中使用 ToString()。您可以做的是在查询之前创建一个属性/变量并设置其值 .ToString(),而不是使用该属性/变量(并删除 .ToString())。类似的东西:c-sharpcorner.com/blogs/…
-
这是 LINQ to SQL 还是 LINQ to EF?
ToString似乎在 LINQ to SQL 中静态或动态地为我工作。 -
如果类型是数字,你可以试试
SqlFunctions.StringConvert。 -
@NetMage 这是
IQueryable形式的 Linq to SQL。如果我先调用ToList()或ToEnumerable()可能会起作用,但我不想在内存中处理它。我尝试在动态表达式(以字符串形式编写)中使用SqlFunctions.StringConvert,但它给了我一个错误。现在我只能检查它是否是数字,我使用==,如果是字符串我使用.Contains()。这不是我想要的。它的行为不像Like运算符。 -
您使用的是 EF 的哪个版本?
标签: c# sql-server linq dynamic dynamic-linq