C# 如何使用Linq进行字符串组合和查询

C# 如何使用Linq进行字符串组合和查询,c#,linq,tostring,C#,Linq,Tostring,如何将变量组合成字符串,并在LINQ查询中的where条件中使用该字符串?我试过这个: query = query.Where(p => (p.Cod + p.Year + p.Count).StartsWith("BS201412")); 我的变量如下: Cod类型为string Year类型为short Count的类型为int 我也试过: query = query.Where(p => (p.Cod + SqlFunctions.StringConvert((dou

如何将变量组合成字符串,并在LINQ查询中的where条件中使用该字符串?我试过这个:

query = query.Where(p => (p.Cod + p.Year + p.Count).StartsWith("BS201412"));
我的变量如下:

  • Cod
    类型为
    string
  • Year
    类型为
    short
  • Count
    的类型为
    int
我也试过:

  query = query.Where(p => (p.Cod + SqlFunctions.StringConvert((double) p.Year)+ SqlFunctions.StringConvert((double) p.Count)).StartsWith("BS201412"));

但是由于
Year
的原因,查询在两种变体中都不起作用。

您有很多选择,其中两种是:

  • 使用-它会自动将每个参数转换为字符串
  • 对复变量使用此方法
  • 例如:

    string cod = "BS";
    short year = 14;
    int count = 100;
    Console.WriteLine(String.Format("{0}{1}{2}", cod, year, count));
    Console.WriteLine(cod + year.ToString() + count.ToString());
    
    两种情况下的输出相同:

    BS14100
    BS14100
    
    您的查询行可能如下所示:

    query = query
            .Where(p => String.Format("{0}{1}{2}", p.Cod, p.Year, p.Count)
            .StartsWith("BS201412"));
    
    var searchFor = "BS201420";
    var cod = searchFor.Substring(0, 2);
    // example - use short.TryParse in your code
    var year = short.Parse(searchFor.Substring(2, 4));
    // example - use int.TryParse in your code
    var count = int.Parse(searchFor.Substring(4,2));
    query = query.Where(p => p.Cod == cod && p.Year == year && p.Count == count);
    

    因为您使用的是LINQ2SQL,所以无法使用某些函数(因为它们不能直接转换为SQL)。您可以尝试另一种方法-看起来您有要搜索的字符串
    BS201420
    ,因此您可以对字符串进行分区,将每个部分转换为相应的类型,并编写一个普通查询,如下所示:

    query = query
            .Where(p => String.Format("{0}{1}{2}", p.Cod, p.Year, p.Count)
            .StartsWith("BS201412"));
    
    var searchFor = "BS201420";
    var cod = searchFor.Substring(0, 2);
    // example - use short.TryParse in your code
    var year = short.Parse(searchFor.Substring(2, 4));
    // example - use int.TryParse in your code
    var count = int.Parse(searchFor.Substring(4,2));
    query = query.Where(p => p.Cod == cod && p.Year == year && p.Count == count);
    

    这应该找到与字符串相同的结果集,并以开头。

    代码中的3个属性是该类中唯一的属性吗?如果是这样,您可能希望重写ToString,使其看起来像query.Where(p=>p.ToString().StartsWith(“value”))。你到底想要什么?如果Count=123或Count=12会发生什么情况?这应该是同样的吗?只是为了可读性,您可能希望使用带有
    let
    表达式的查询语法:
    query=from q in query let key=String.Format(“{0}{1}{2}”,p.Cod,p.Year,p.Count),其中key.StartsWith(“BS201412”)(如果注释字段允许,也可以换行。:)我很确定这不会起作用:
    query=query.Where(p=>p.Stringify().StartsWith(“BS201412”)这是LINQ to SQL(或实体),无论哪种情况,都不能在查询中使用自定义函数。可以创建将功能添加到实体的分部类。删除注释的示例。我也尝试过这样做:query.where(p=>String.Format(“{0}{1}{2}”,p.Cod,p.Year,p.Count).StartsWith(“BS14100”);此异常:LINQ to Entities无法识别方法“System.String Format(System.String,System.Object,System.Object,System.Object)”方法,并且无法将此方法转换为存储表达式。