C#Dynamic Linq:在Where子句中实现“赞”

Alv*_*nus 10 c# linq sql-server dynamic dynamic-linq

因此,我想对我的数据进行常规分类。我有这段代码从数据库中获取数据,该数据库将仅提取包含的数据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);
}
Run Code Online (Sandbox Code Playgroud)

该模型是这样的:

public class ManageSubscriberItems
{
    public int? UserId { get; set; }
    public string Email { get; set; }
    public Guid SubscriberId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时:

models = (IQueryable<ManageSubscriberItems>)EcommerceCMS.Helpers.FilterHelper
    .SortList(searchString, typeof(ManageSubscriberItems), models);

if(models.Any())
Run Code Online (Sandbox Code Playgroud)

它引发此错误:

“ LINQ to Entities无法识别方法'System.String ToString()',并且该方法无法转换为商店表达式。”


编辑

我找到了问题,但仍然无法解决。因此,如果该属性不是string,它将在调用时引发错误.ToString().Contains()

model = model.Where(propertyName + " != NULL AND " + propertyName + 
    ".ToString().Contains(@0)", value);
Run Code Online (Sandbox Code Playgroud)

我想要LIKE在查询中实现。谁能帮我?

Ste*_*ath 8

如果将System.Linq.Dynamic.CoreEF Core一起使用,则可以选择使用

var q = context.Cars.Where(config, "DynamicFunctions.Like(Brand, \"%a%\")");
Run Code Online (Sandbox Code Playgroud)

参见以下示例链接:https : //github.com/StefH/System.Linq.Dynamic.Core/blob/6fc7fcc43b248940560a0728c4d181e191f9eec1/src-console/ConsoleAppEF2.1.1/Program.cs#L117

而且我刚刚在linqpad中测试了连接到真实数据库的过程,并且这样的代码行得通吗?

var result1 = Entity1s.Where("Url != NULL AND it.Url.Contains(@0)", "e");
Run Code Online (Sandbox Code Playgroud)


[更新2019-04-17]

如果您不知道类型,可以将其强制转换为object,然后将其强制转换为string

码:

var r = Entity1s.Select("string(object(Rating))").Where("Contains(@0)", "6");
Run Code Online (Sandbox Code Playgroud)