实际上我有一个这样的表达式,在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
我不知道为什么......
卡琳
答案 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