我应该怎么初始化的IQueryable变量,使用前联盟体现在哪里? [英] how should I initialize IQueryable variables, before use a Union expression?

查看:2106
本文介绍了我应该怎么初始化的IQueryable变量,使用前联盟体现在哪里?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创造了超过IQueryable的类型的扩展方法,这需要实体的一个子集,其中过滤后的一些criterrions。我的问题是我无法回报作出的变量的联合表达,不都被首先初始化。 。Null值,因为aprears,是无效的。



 公共静态的IQueryable<&人GT; FilterHairColors(这IQueryable的<&人GT;子查询字符串[] hairColors)
{
&IQueryable的LT;人> Q1 = NULL;
&IQueryable的LT;人> Q2 = NULL;
&IQueryable的LT;人> Q3 = NULL;
&IQueryable的LT;人> Q4 = NULL;

的foreach(在hairColors VAR值)
{
开关(值)
{
案1:
Q1 =子查询。其中,(p => p.HairColor_bright == TRUE);
中断;
案2:
Q2 = subQuery.Where(P => p.HairColor_brown == TRUE);
中断;
案3:
Q3 = subQuery.Where(P => p.HairColor_dark == TRUE);
中断;
案4:
Q4 = subQuery.Where(P => p.HairColor_red == TRUE);
中断;
}
}
返回q1.AsQueryable()联盟(q2.AsQueryable())联盟(q3.AsQueryable())联盟(q4.AsQueryable())。;
}



所提出的代码块的几个部分,其产生的一个子集数据传送到后续的过滤方法是这样的:

  =结果persons.FilterGender(vm.gender).FilterAge(VM。年龄).FilterHeight(vm.height)...... 


解决方案

不要叫联盟时的一个参数为null。



什么是空查询对你意味着什么?如果这意味着无行,那么就是不联盟了。如果它意味着所有行,你不需要工会的,因为你可以只取底层的,未经过滤的搜索



这样的:

  VAR的结果=新的[] {Q1,Q2,Q3,Q4,}。凡(查询=>!=查询NULL).Aggregate(可查询。联盟); 

这是使用LINQ到对象构造一个LINQ到SQL查询。



一个新版本:

  VAR的结果= dataContext.Persons.Where(_ = GT;假); 
如果(Q1!= NULL)结果= result.Union(Q1);
如果(Q2!= NULL)结果= result.Union(Q2);
如果(Q3!= NULL)结果= result.Union(Q3);
如果(Q4!= NULL)结果= result.Union(Q4);



SQL Server查询优化器将删除第一个哑查询,以便它没有运行成本可言。


I've created an extension method over IQueryable type, which takes a subset of entities and filters them upon some criterrions. My problem is that I can't return a Union expression made of the variables, without all being initialized first. Null values, as aprears, are not valid.

public static IQueryable<Person> FilterHairColors(this IQueryable<Person> subQuery, string[] hairColors)
    {
        IQueryable<Person> q1 = null;
        IQueryable<Person> q2 = null;
        IQueryable<Person> q3 = null;
        IQueryable<Person> q4 = null;

        foreach (var value in hairColors)
        {
            switch (value)
            {
                case "1":
                    q1 = subQuery.Where(p => p.HairColor_bright == true);
                    break;
                case "2":
                    q2 = subQuery.Where(p => p.HairColor_brown == true);
                    break;
                case "3":
                    q3 = subQuery.Where(p => p.HairColor_dark == true);
                    break;
                case "4":
                    q4 = subQuery.Where(p => p.HairColor_red == true);
                    break;
            }
        }
        return q1.AsQueryable().Union(q2.AsQueryable()).Union(q3.AsQueryable()).Union(q4.AsQueryable());
    }

The presented code block is part of several more, and each produces a subset of data, conveyed to a subsequent filtering method this way:

results = persons.FilterGender(vm.gender).FilterAge(vm.age).FilterHeight(vm.height)......  

解决方案

Don't call Union when one of the arguments is null.

What does a "null-query" mean to you? If it means "no rows" then just don't Union it. If it means "all rows" you don't need to union because you can just take the underlying, unfiltered query.

Like this:

var result = new [] { q1, q2, q3, q4, }.Where(query => query != null).Aggregate(Queryable.Union);

This is using LINQ-to-Objects to construct a LINQ-to-SQL query.

A new version:

var result = dataContext.Persons.Where(_ => false);
if(q1 != null) result = result.Union(q1);
if(q2 != null) result = result.Union(q2);
if(q3 != null) result = result.Union(q3);
if(q4 != null) result = result.Union(q4);

The SQL Server query optimizer will remove the first dummy query so that it has no runtime cost at all.

这篇关于我应该怎么初始化的IQueryable变量,使用前联盟体现在哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆