データベース検索の実行中に、文字列の値から最初の文字を引いた値でリストを並べ替えるにはどうすればよいですか (私の場合、最初の文字は常に C の後に数字が続きます)。
私は多くのことを試しましたが、暗闇の中でほとんどつまずいています。ここの誰かがこれをすぐに解決できると確信しています.
動作する私のコード(しかし、私が望むことはしません):
List<Customer> customerlist = null;
try
{
customerlist = db.Customers
.Where(u => (u.Cust_ID+u.Given_Name+u.Surname).Contains(searchstring))
.OrderBy(u => u.Cust_ID)
.ToList();
}
現時点での私のバグのあるコード (動作するはずですが、検索では常に結果が返されません):
List<Customer> customerlist = null;
try
{
customerlist = db.Customers
.Where(u => (u.Cust_ID+u.Given_Name+u.Surname).Contains(searchstring))
.OrderBy(u => Int32.Parse(u.Cust_ID.TrimStart('C')))
.ToList();
}
詳細:
テーブルに Cust_ID という名前の列があります。この列は C で始まり、その後に C1、C2、... C43、... C999 などの先行ゼロのない数字が続きます。
ユーザーが検索を実行できるようにしています。そのクエリは searchstring に割り当てられています。
int パースを削除してデバッグを試みました
.OrderBy(u => u.Cust_ID.TrimStart('C'))
それも結果を返しません。
ここにある元のコードは、検索を完了するために引き続き機能しますが、正しくソートされません。
.OrderBy(u => u.Cust_ID)
TrimStart の代わりに Replace を使用してみました
.OrderBy(u => u.Cust_ID.Remove(0, 1))
そして、これは結果を返しますが、まだソートしません.Int解析を入れると、再び結果を返すのをやめます:
.OrderBy(u => Int32.Parse(u.Cust_ID.Remove(0, 1)))
int パースを次のように切り替えてみました。
.OrderBy(u => int.Parse(u.Cust_ID.Remove(0, 1)))
しかし、それは役に立ちませんでした。
編集:例外が発生していることがわかりました:
System.NotSupportedException: LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression.
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.Convert()
at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at lab2.Controllers.DemoController.retrievecustomers() in [[Directory]]Controller.cs:line 52