gpt4 book ai didi

c# - 在一对多 Entity Framework 关系中使用 Dynamic LINQ Where

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:23 27 4
gpt4 key购买 nike

我正在使用 EF 6 和 .net 4.5。我有一个“文档”表,其中包含 PK“DocumentId”(Int)和另一列“标题”。我有另一个名为“DocumentFilters”的表,其中包含列“DocumentId”(Int) 和“DocGUID”(Guid)。两个表之间的“Doc Id”有一个 FK。它是 Documents 和 DocumentFilters 表之间的一对多 Id 关系。模型看起来像这样:

DocModel

我正在尝试使用 NuGet 包中的 DynamicLibrary.cs 库编写动态 LINQ 查询。

使用常规 Linq,查询在 C# 中看起来像这样:

DocDBContext db = new DocDBContext();
var documents = db.Documents.Include(d => d.DocumentFilters);
Guid gTest = Guid.Parse("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");

documents = documents.Where(d => d.DocumentFilters.Select(f => f.DocGUID).Contains(gTest));

这完美地工作并检索由我感兴趣的 GUID 过滤器分隔的文档。但是,我需要将它动态地放在过滤器字符串中,它可能包含其他过滤器。有可能这样做吗?我试过这样的代码:

documents = documents.Where("DocumentFilters.Select(DocGUID).Contains(@0)", gTest);

错误:不存在适用的聚合方法“Select”

documents = documents.Where("DocumentFilters.DocGUID=@0", gTest);

错误:GUID 属性在 DocumentFilters 上不存在。(这是有道理的,因为 DocumentFilters 是一个集合)。

我还认为可能值得尝试一下:

documents = documents.Where("DocumentFilters.AsQueryable().Select(DocGUID).Contains(@0)", gTest);

但同样,它看起来不像库支持 AsQueryable 并抛出错误:不存在适用的聚合方法“AsQueryable”。

是否可以在 Documents 表中的可枚举对象的属性上写这样的限制?

最佳答案

因此,一种解决方案是通过将“Select”添加到 ExpressionParser 类中的 IEnumerableSignatures 接口(interface)来修改 Dynamic.cs。并将其添加到 ParseAggregate() 方法中:

if (signature.Name == "Min" || signature.Name == "Max")
{
typeArgs = new Type[] { elementType, args[0].Type };
}
else if (signature.Name == "Select")
{
typeArgs = new Type[] { elementType, Expression.Lambda(args[0], innerIt).Body.Type };
}

但是,在此之后我仍然需要重载 Contains() 方法以使用 GUID。我懒得那样做。相反,我意识到我可以简单地使用已经支持的 .Any() 而不是 .Select()!

documents = documents.Where("DocumentFilters.Any(DocGUID.Equals(@0))", gTest); //!!!

我还必须将列名称从“GUID”更改为“DocGUID”,因为在编写 GUID.Equals() 时限制字符串,解析器将其误认为是 GUID 类型而不是列名,并抛出 Equals() 不是 GUID 类型的有效扩展名的错误。

抱歉浪费了大家的时间!

关于c# - 在一对多 Entity Framework 关系中使用 Dynamic LINQ Where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486222/

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