1

我有一个 Linq 查询,有时加入两个数据集,有时加入三个数据集。第三组永远不会返回数据,它仅用于根据其内容过滤数据。我使用 Predicate Builder 动态创建 wheres 但不确定动态包含/排除连接数据集的正确方法。

有时这是:

var filteredResults = from d in dateRangeResults
                              join n in results on d.ID equals n.ID                                
                              select new { name = n, demo = d };

其他时候我需要这个:

    var filteredResults = from d in dateRangeResults
                              join n in results on d.ID equals n.ID
                              join p in PnSIncludeResults on n.ID equals p
                              select new { name = n, demo = d };

是否有最佳实践或技术?TIA

4

1 回答 1

4

if为了提高性能,我会在语句中添加额外的连接。这将在两种情况下构建一个有效的查询:

var filteredResults = from d in dateRangeResults
                      join n in results on d.ID equals n.ID
                      select new { name = n, demo = d };

if(filterExtra)
{
    filteredResults = from result in filteredResults
                      join p in PnSIncludeResults on result.name.ID equals p
                      select result;
}

如果您更关心可读性,可以使用where子句代替join子句:

var filteredResults = from d in dateRangeResults
                      join n in results on d.ID equals n.ID
                      where !filterExtra || PnSIncludeResults.Contains(n.ID)
                      select new { name = n, demo = d };

LINQ to Entities 可能会优化生成的查询,但您应该检查以确保。

于 2012-12-21T19:24:40.090 回答