如何在C#中找到最高版本的varchar?

时间:2012-08-22 21:22:33

标签: c# sql

我正在尝试用C#获取最新版本的程序。下面的代码是我能够让代码在我的控制器中运行而没有任何错误的唯一方法:

PList = PList.Where(x => x.PSP == LP && x.VERSION == "1.3");

问题是除非我在每个新版本中维护此代码并在代码中将其更正为最新版本,否则它将无法正常工作。

所以我认为我可以使用 max 函数来获取最新版本,但它是SQL DB中的varchar,我无法更改它,因为我无法访问更改类型。

我尝试过不同的方法,就像下面的例子一样没有运气。

PList = PList.Where(x => x.PSP == LP && x.VERSION.MAX());

运营商'&&'不能应用于'bool'和'char'

类型的操作数

那么当我需要知道PSP是否等于LP AND 版本是数据库中的最高数字时,如何获得Max版本?谢谢你的帮助!

更新

谢谢大家的优秀答案,我可以看到他们中的一些人可能会如何工作,但他们都没有使用我的代码。我认为发布其余的代码可能有助于使问题诊断更容易一些,所以这里是其余的代码。

public virtual ActionResult getAjaxP(string TP = null)
{
    if (TP != null)
    {
        var PList = from x in db.iamp_mapping select x;
        PList = PList.Where(x => x.PSP == TP);
        return Json(PList.Select(x => new { x.PS }).Distinct().ToArray(), JsonRequestBehavior.AllowGet);
    }
    return View();
}

3 个答案:

答案 0 :(得分:4)

不幸的是,您的版本号存储为文本。这意味着“1.11”实际上早于“1.3”。

除此之外,您可以使用OrderByDescending。例如

var item = PList.Where(x => x.PSP == LP)
                .OrderByDescending(x => x.VERSION)
                .First();

这将获得具有最高版本号的单项。如果多个项目与该版本号匹配,则会稍微复杂一些 - 您可能希望按版本分组,然后按组密钥排序。基本上我们需要更多关于你想要达到的目标的信息。

答案 1 :(得分:4)

您可以利用System.Version类。

var maxVersion = PList
    .Select(x => new Version(x.VERSION))
    .Max()
    .ToString();

PList = PList.Where(x => x.PSP == LP && x.VERSION == maxVersion);

例如,这将有利于“1.11”而不是“1.3”。

如果这是Linq-to-Sql,则可能需要额外调用数据库。

答案 2 :(得分:1)

试试这个

 var Max_VERSION = (from x in PList where x.PSP == LP select x.VERSION).Max();

简单示例:

string[] versions = {"1.3","1.8","4.1","1.9", "1.4", "0.5", "1.7" };
           var max_VeRsion = (from p in versions select p).Max();

糟糕:

 string[] versions = {"1.3","1.8","4.2","1.9", "4.11", "0.5", "1.17" };

        var mv = (from p in versions
                 let m = versions.Max().Split(Convert.ToChar(".")).First()
                 let n = (from q in versions
                          where q.Split(Convert.ToChar(".")).First() == m
                          select Convert.ToInt32(q.Split(Convert.ToChar(".")).Last())).Max().ToString()
                 where
                     p.Split(Convert.ToChar(".")).First() == m && p.Split(Convert.ToChar(".")).Last() == n
                 select p).First();

上次尝试:)

        string max_version_work = (from q in
                                       (from p in versions
                                        select new
                                        {
                                            Ma = Convert.ToInt32(p.Split('.').First())
                                            ,
                                            Mi = Convert.ToInt32(p.Split('.').Last())
                                        })
                                   orderby q.Ma descending, q.Mi descending
                                   select string.Format("{0}.{1}", q.Ma, q.Mi)).FirstOrDefault();