2014-10-16 41 views
0

我在执行ASP.NET MVC项目下面的LINQ查询:只有参数构造函数初始化,并在LINQ的支持,以实体错误,而这样做的版本检查

Version baseVersion = new Version("1.0.0.0"); 
var v = (from a in db.table where new Version(a.version) > baseVersion select new { a.id, a.version, a.name}).ToList(); 

在执行这个我得到这个错误:

Only parameterless constructors and initializers are supported in LINQ to Entities

当我删除版本检查,并用这个查询:

var v = (from a in db.table select new { a.id, a.version, a.name}).ToList(); 

它成功执行。如何使版本条件的linq查询工作?

+1

你的链接被编译成sql代码,并且sql不知道什么是'Version',所以这可能不会是你想要解决这个问题的方式 – AlexanderBrevig 2014-10-16 11:51:42

+0

@AlexanderBrevig有没有其他方法? – Jaguar 2014-10-16 11:54:11

+0

不幸的是我认为@Marten的建议是你唯一的选择。如果您的版本号不会超过一位小数(即最大值为9.9.9.9),那么您可以使用字符串比较并滥用SQL的自然比较。 '新的a.version>“1.0.0.0”' – AlexanderBrevig 2014-10-16 12:22:19

回答

1

如果您想使用Version类来进行比较,那么除了将整个表格导入到内存中并且在那里进行比较之外,我没有其他选择。您可以使用IQueryable<T>.AsEnumerable()来指定您想要在内存中执行任何操作。

Version baseVersion = new Version("1.0.0.0"); 
var v = db.Table 
    .Select(x => new { x.id, x.version, x.name }) 
    .AsEnumerable() 
    .Where(x => new Version(x.version) > baseVersion) 
    .ToList(); 

注:我搬到了.Select(...)到后立即db.Table,只选择其中的内存占用减少您需要的列。

另一种方法是在SQL中重新创建Version比较。但是,你正在重新发明轮子。

相关问题