gpt4 book ai didi

c# - 如何动态构建与 Linq 和 Entity Framework 相关的 Select

转载 作者:行者123 更新时间:2023-11-30 17:33:12 26 4
gpt4 key购买 nike

我想做以下事情

public async Task<List<dynamic>> searchEntities(string query, list<string> columnNames)
{
var columNames = GetPropertiesUsingReflectionAndfilter<Entity>(columnNames);
await db.entities.select(x => { columnNames }).where(...)..ToListAsync();
}

我需要在 Controller 中公开自定义 EF 搜索方法。我想提供部分回应。 $search 在我使用的 OData 版本中无效。

这可能与 IQueryable 相关吗?

另一种方法是构建参数化 SQL 查询。想知道使用 EF 和 Linq 是否有更好的方法?谢谢..

解决方案:

感谢@IvanStoev,我最终添加了一个库 System.Linq.Dynamic (免费下载超过 100 万次),以实现此目的。我现在有。

using System.Linq.Dynamic;

var columnNames = GetColumNames<Entity>(qry.TableList);
var selector = "new(" + String.Join(", ", columnNames.ToArray()) + ")";

var results = await db.Lessons
.Where(x => x.LessonName.Contains(qry.Query) == true || x.HTML.Contains(qry.Query) == true)
.Select(selector)
.ToListAsync();

return Ok(results);

TLDR。我的场景的完整用法。

Controller :

[HttpPost, Route("Search/Lessons")]
public async Task<IHttpActionResult> SearchLessons([FromBody] SearchQuery qry)
{
var columnNames = GetColumNames<Lesson>(qry.TableList);

if (columnNames.Count < 1) {
return BadRequest();
}

var selector = "new(" + String.Join(", ", columnNames.ToArray()) + ")";

var results = await db.Lessons
.Where(x => x.LessonName.Contains(qry.Query) == true || x.HTML.Contains(qry.Query) == true)
.Select(selector)
.ToListAsync();

return Ok(results);
}

还有 helper :..

private List<string> GetColumNames<T>(List<string> columnsToFetch = null)
{
var properties = GetProperties<T>();
var columnNames = new List<string>();

if (columnsToFetch == null)
{
return properties;
}

foreach (var columnRequested in columnsToFetch)
{
var matchedColumn = properties
.Where(x => x.ToLower() == columnRequested.ToLower())
.FirstOrDefault();

if (matchedColumn != default(string))
{
columnNames.Add(matchedColumn);
}
}

return columnNames;
}

还有..

private List<string> GetProperties<T>()
{
dynamic model = TypeDescriptor.GetProperties(Activator.CreateInstance<T>());

List<string> result = new List<string>();
foreach (var prop in model)
{
result.Add(prop.Name);
}
return result;
}

最佳答案

免责声明:我是项目的所有者Eval-Expression.NET

此库不是免费的,但允许您在运行时编译和执行 C# 代码。例如,您可以动态执行任何 LINQ

教程:LINQ Dynamic

例子:

public searchEntities(string query, list<string> columnNames)
{
await db.entities.SelectDynamic(x => "{" + string.Join(",", columnNames) + "}")
.where(...)..ToListAsync();
}

关于c# - 如何动态构建与 Linq 和 Entity Framework 相关的 Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com