【发布时间】:2011-08-30 21:36:27
【问题描述】:
我有一个名为:AttachmentType 的实体,它有一个属性 ShowDuringRegistration 作为字节
执行此行时,我总是看到此错误:指定的转换无效,无论我发送一个字节作为参数
Repository<AttachmentType>.FindBySpecification(new AttachmentSearchSpecification()
.WithTraceCodeOrNationalNumber(traceCodeString)
.WithAttachmentTypeShowDuringRegistration(false))
.Select(p=>new attachmentTypeModel()
{
Id=p.Id,
Title=p.Title
})
.ToList();
public AttachmentSearchSpecification WithAttachmentTypeShowDuringRegistration(bool showDuringRegistration=false)
{
AddExpression(p => p.AttachmentType.ShowDuringRegistration == (showDuringRegistration ? 1 : 0));
return this;
}
即使我向 WithAttachmentTypeShowDuringRegistration 方法发送一个字节并将 ShowDuringRegistration 与该属性进行比较,它也不起作用
byte b=0;
Repository<AttachmentType>.FindBySpecification(new AttachmentSearchSpecification()
.WithTraceCodeOrNationalNumber(traceCodeString)
.WithAttachmentTypeShowDuringRegistration(b))
.Select(p=> new attachmentTypeModel()
{
Id=p.Id,
Title=p.Title
})
.ToList();
public AttachmentSearchSpecification WithAttachmentTypeShowDuringRegistration(byte showDuringRegistration)
{
AddExpression(p => p.AttachmentType.ShowDuringRegistration == showDuringRegistration)
return this;
}
这是引发错误的时间:
select cast(count(*) as INT)
as col_0_0_ from EmploymentRegistration.[Attachment]
attachment0_, EmploymentRegistration.[Demand] demand1_,
EmploymentRegistration.[AttachmentType] attachment5_ where ttachment0_.DemandId=demand1_.DemandId
and demand1_.PersonId=person3_.PartyId and person3_.PartyId=birthcerti4_.PersonId and
attachment0_.AttachmentTypeId=attachment5_.AttachmentTypeId
and (demand1_.TraceCode like ('%'+?+'%') or birthcerti4_.NationalNumber like ('%'+?+'%'))
and attachment5_.ShowDuringRegistration=?
内部异常:{"Specified cast is not valid."}
protected void AddExpression(Expression<Func<T, bool>> expression); this method get an experssion and append that expression to the linq query
public class AttachmentTypeMap : ClassMap<AttachmentType>
{
public AttachmentTypeMap()
{
Schema("EmploymentRegistration");
Id(p => p.Id);//int identity
Map(p => p.Title);//string
Map(p => p.ShowDuringRegistration);//byte
Map(p => p.ScriptName)
.Length(100);
References(p => p.EmploymentLicense);
}
}`
通过执行如下更简单的查询:
Repository<AttachmentType>.FindAll().Where(p=>p.ShowDuringRegistration==(byte)1).Tolist();
将像这样生成
选择 cast(count(*) as INT) as col_0_0_ from
EmployRegistration.[AttachmentType] attachment0_ 左外连接
就业登记。 [就业证]就业1_
在附件 0_.EmploymentLicenseId=employment1_.EmploymentLicenseId 上
attachment0_.ShowDuringRegistration=?
当我想知道返回值的个数时
int _totalItems = Query.Count(); //Query is IQueryable<T>
我会再次看到错误
即使只是执行此查询,也会像以前一样引发错误:
//ShowDuringRegistration is byte?
var data= Repository<AttachmentType>.Find(p => p.ShowDuringRegistration == 0)
.ToList();
public interface IRepository<T> where T : class
{
IQueryable<T> Find();
IQueryable<T> Find(object id);
IQueryable<T> FindBySpecification(ISpecification<T> specification);
IQueryable<T> Find(Expression<Func<T, bool>> expression);
}
public static class Repository<T> where T : class
{
private static IRepository<T> Current
{
get { return UnitOfWork.GetRepository<T>(); }
}
public static IQueryable<T> Find(Expression<Func<T, bool>> expression)
{
return Current.Find(expression);
}
public static IList<T> FindAll(Expression<Func<T, bool>> expression)
{
return Current.FindAll(expression);
}
}
【问题讨论】:
-
现在你已经介绍了
FindAll- 那是什么?老实说,您的代码仍然很不清楚 -Tolist而不是ToList的拼写错误表明这不是真的您的代码。如果你能展示一个简短但完整的例子,那真的很有帮助。见tinyurl.com/so-hints。 -
根据目前的讨论,可能是 AttachmentType 的定义问题。如果您需要进一步的帮助,您确实需要发布堆栈跟踪。