2014-10-30 26 views
2

其实我有一个这样的表达,在LINQ的情况下,以实体不能含蓄转化类型System.Linq.Expression <System.Func <对象,布尔>>为bool

工作得很好
public static Expression<Func<Tender, bool>> GetPublic() 
{ 
    var now = DateTime.Now.GetEasternStandardDateTime(); 

    return tender => tender.EndDate > DateTime.Now && 
        tender.IsClosed == false && 
        tender.IsCancel == false && 
        tender.PrivacyLevelId == 1; 
} 

我可以使用像这样的表达式:_repositoryObject.Where(GetPublic()),我会得到结果。

但是,当我需要做的LINQ到SQL模式这样

var results = from t in Tenders 
       where Tender.GetPublic() 
       select t; 

我有这样的错误,我不能使用相同的表达

无法含蓄转化类型 System.Linq.Expression>到bool for Linq去 SQL

我不知道为什么...

卡林纳

+0

这是怎么回事? – ArtOfCode 2014-11-02 17:46:43

回答

4

首先,我怀疑你真正的意思是,你可以称其为:

_repositoryObject.Where(GetPublic()) 

它,你呼叫的方法来获取表达式树是很重要的。

查询表达式被转换成:

var results = Tenders.Where(t => Tender.GetPublic()); 

...这是不是你要找的东西。基本上,查询表达式被转换为使用lambda表达式的方法调用。在这种情况下你不需要这么做,所以你不应该使用查询表达式。

如果你想用查询表达式做其他事情,你总是可以混合和匹配,例如,

var results = from t in Tenders.Where(Tender.GetPublic()) 
       where t.SomeOtherProperty 
       select t.SomethingElse; 
+0

如果我不想混合搭配,如果我不应该使用查询表达式,我有哪些选择? – Karine 2014-10-30 14:40:35

+1

@Karine:直接使用扩展方法('Where','Select'等)。无论如何,查询表达式只是语法糖。 – 2014-10-30 14:49:47

-1

如果你改变你的方法采取IQueryable<Tender>,并返回另一个IQueryable<Tender>您的标准添加,那么它可能会奏效。

public static IQueryable<Tender> AddPublicCriteria(this IQueryable<Tender> tenderQuery) { 
    // I've omitted your call to DateTime.Now.GetEasternStandardDateTime() 
    // since you do not use it. 
    return tenderQuery 
     .Where(tender => tender.EndDate > DateTime.Now && 
         tender.IsClosed == false && 
         tender.IsCancel == false && 
         tender.PrivacyLevelId == 1 
     ); 
} 

var query = Tenders;      // Original table or data-set 
query = query.AddPublicCriteria();   // Add criteria 
var results = query.ToList();    // Run query and put the results in a list 
+0

这仍然要求他在查询语法之外使用此操作。 – Servy 2014-10-30 14:55:49

相关问题