基于LINQ to Entity在运行时决定的属性添加包含Contains的多个Wheres

时间:2015-04-06 19:02:07

标签: c# linq entity

我们有一个具有多个属性的数据对象,映射到相应的数据库表。

public partial class Sources
    {
        ...
        public string business_unit { get; set; }
        public string booking_point { get; set; }
        public string account { get; set; }
        ...
    }

我们尝试通过为每个选定维度创建列表,根据某些运行时决定的输入过滤数据集。请注意,leafList与dimLeaves一样按预期工作。问题是我们无法使用leafList过滤我们的主数据集。

由于我们无法将DB与内存中的项目混合使用,因此我们首先抓取部分数据集并构建内存查询。 我们遇到的问题是从单独的列表中添加Contains,具体取决于运行时选定的属性。

internal void GetSourceTotal(Int16 fiscal_year, Byte fiscal_month, Byte version)
        {

        using (DataContext db = new DataContext(AppEnvironment.DirectConnectionString))
        {
            var values = db.GetTable<Sources>();

            // full dataset to copy in-memory
            var finacQuery = (from s in values
                         where s.fiscal_year == fiscal_year && s.fiscal_month == fiscal_month && s.period_version == version
                         select s).ToList();

            var dimQuery = (from s in finacQuery
                         select s);

            foreach (KeyValuePair<string, int> dim in MainRibbon.dimensions)
            {
                    var dimLeaves = this.GetType().GetProperty(dim.Key).GetValue(this, null);
                    if (dimLeaves != null)
                    {
                        var leafList = this.ParseTreeDimensions(dimLeaves.ToString(), dim.Value);

                        // this has no impact on ToList() later down. dim.key is equal to, for example "business_unit"
                        dimQuery.Where(s => leafList.Contains(s.GetType().GetProperty(dim.Key).Name));
                    }
            }
            var test = dimQuery.ToList();
        }
    }

dimQuery.Where(s => leafList.Contains(s.GetType().GetProperty(dim.Key).Name));是我们想要帮助的地方。经过大量的搜索,我们还没有找到一个有效的模式。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

Where不会改变查询,会返回一个新查询,它代表原始查询,但附加了一个过滤器。你现在正在忽略那个返回值而只是扔掉它。