无法隐式转换类型System.Linq.Expression<System.Func<Object, bool>>为bool。

3

实际上,我有一个类似于这样的表达式,在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>隐式转换为Linq to SQL中的bool类型

但我不知道为什么会出现这个错误...

Karine


这个是在哪一行出现的? - ArtOfCode
2个回答

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;

如果我不想混合使用,如果我不应该使用查询表达式,我有哪些替代选择? - Karine
1
@Karine:直接使用扩展方法(WhereSelect等)。查询表达式只是语法糖而已。 - Jon Skeet

-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

这仍然需要他在查询语法之外使用此操作。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接