日期:2014-05-20  浏览次数:20885 次

linq中如何把部分查询条件提取到一个位置,并在多处调用
比如

var query = from record in db.XXXRecord
            where record.Status==3 || record.Status==5 || record.Status == 8 || record.Status == 12
            select record;
             

像这样record.Status==3 || record.Status==5 || record.Status == 8 || record.Status == 12类似的条件在很多地方linq查询中重复使用到,所以每次写代码都得写一长串,并且以后万一要修改部分条件的话会非常麻烦,所以我想写一个属性

// Database.cs
public partial class XXXRecord
{
    public bool IsValid
    {
        get
        {
            return Status==3 || Status==5 || Status == 8 || Status == 12;
        }
    }
}
 
// xxxx.cs
var query = from record in db.XXXRecord
            where record.IsValid
            select record;
      
但是调试的时候还是提示不支持转换成sql语句。
其实我考虑过可以把这个条件添加到表的字段里,但是我不想修改数据库。
我希望提取这一段在多处大量重复的简单代码到某一个位置,以方便日后修改和查看,但提取到方法和属性不支持被转换成SQL查询字符串,
还有什么方法可以做到吗?

------解决方案--------------------
那个不是一个完整的Linq Query对象,你存什么呢?

你只能把它作为一个方法来调用,例如写
public static IQuery<XXXX> MyFilter<XXXX>(this IQuery record)
{
    return from x in query 
    where record.Status==3 
------解决方案--------------------
 record.Status==5 
------解决方案--------------------
 record.Status == 8 
------解决方案--------------------
 record.Status == 12
    select x;
}


把代码提取为一个方法重复调用,我想你会。只是可能你没有想到这么简单。