无法隐式转换类型System.Linq.Expression <system.func <object,bool =“”>&gt; bool </system.func <object,>

时间:2014-10-30 11:48:18

标签: c# linq entity-framework expression

实际上我有一个这样的表达式,在Linq to Entity

的情况下效果很好
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 to SQL模式时,我不能使用相同的表达式

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

我有这个错误

  

不能隐含转换类型   System.Linq.Expression&GT;为了Linq而来   SQL

我不知道为什么......

卡琳

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-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