0

我一直在尝试通过表中不是主键的字段从 LLBLGen 加载单个项目。

我只能弄清楚如何对 FetchEntity 的主键进行归档。

要过滤非主键,我必须获取集合并使用 linq 获取第一个。感觉有点臭,不知道有没有更好的方法?

 public BinLocationEntity GetDefaultBinLocation(string firstName, string lastName)
    {


        var persons = new EntityCollection<PersonEntity>();
        var filter = new RelationPredicateBucket();
        filter.PredicateExpression.Add(PersonFields.FirstName == firstName);
        filter.PredicateExpression.Add(PersonFields.LastName== lastName);

        using (var adapter = this.DataAccessAdapter)
        {
            adapter.FetchEntityCollection(persons , filter);
        }
        return persons .First();
    }

我知道演示代码在现实世界中会很糟糕,它只是作为示例。

4

2 回答 2

1

您还可以通过唯一约束获取:

https://www.llblgen.com/Documentation/5.6/LLBLGen%20Pro%20RTF/Using%20the%20generated%20code/Adapter/gencode_usingentityclasses_instantiating.htm#using-a-unique-constraints-value

使用不是主键且不是唯一约束的字段(直接)获取单个实体没有多大意义。生成的代码无法知道您的查询在逻辑上应该导致返回单个实体。

在这些情况下使用 Linq .First() 是完全合适的,根本不是代码/设计的味道。

于 2020-03-09T01:46:37.193 回答
0

我要添加到您的答案中的唯一一件事是,如果您确实希望您的查询将只返回一个结果,那么您将 FetchEntityCollection() 调用更改为:

adapter.FetchEntityCollection(persons , filter, 1);

专门将结果限制为 0 或 1 行。第一个结果很可能是您想要的结果,但是如果没有提供任何上限,则可能是该查询返回了数千行或更多行,这可能会导致巨大的性能损失。

于 2020-05-20T17:55:43.203 回答