gpt4 book ai didi

C# 林奇 : How to stack LINQ queries correctly

转载 作者:行者123 更新时间:2023-11-30 16:32:31 26 4
gpt4 key购买 nike

我有一个允许用户执行无数搜索的表单。需要连接的表因输入的搜索条件而异。 (我下面的例子非常简单,因为两个表都使用相同的子表进行连接,但实际问题并没有那么简单。)

我一直在使用一种称为 LINQ 堆栈的技术,如下所示:

IQueryable<LogENT> results = Context.AssignedLogsENT.Where(l => l.AgencyId);

if(txtFirstName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.FirstName.StartsWith(Object.FirstName)
select r;

if(txtLastName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.LastName.StartsWith(Object.LastName)
select r;

所以你看看是否设置了某个文本字段,我会根据需要添加到查询中。这实际上工作正常,除了当我使用 SQL Profiler 查看生成的查询时,每次添加新条件时它都是 INNER JOINing 表。

即LogAssignments 表包含 3、4、5 次。有什么办法可以防止它多次加入同一张表吗?

或者,有没有更好的方法可以做到这一点?我看过 Predicate Builder,但它似乎不允许连接表,这在我的情况下是必需的。

谢谢!

最佳答案

IQueryable<LogENT> results = Context.AssignedLogsENT.Where(l => l.AgencyId);


results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted
select r;

if(txtFirstName.Text != null)
results = from r in results
p.FirstName.StartsWith(Object.LastName)
select r;

if(txtLastName.Text != null)
results = from r in results
p.LastName.StartsWith(Object.LastName)
select r;

关于C# 林奇 : How to stack LINQ queries correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982428/

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