linq C#使用ToString过滤IQueryable

0mkxixxg  于 12个月前  发布在  C#
关注(0)|答案(4)|浏览(167)

我有一个IQueryable<SomeObject> query,它包含一个属性Value,它是一个double
我想过滤它的字符串,有点千分隔符逗号小数(欧洲)。
我尝试了以下操作:query.Where(q => q.Value.ToString("#,##0.00").StartsWith(someValue)
问题是无法翻译:Translation of method 'double.ToString' failed. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'.
对于我的情况下,它是不可能转换为客户端评估,因为仍然需要应用形式的其他几个过滤器,我的查询。有没有办法解决这个问题?

mxg2im7a

mxg2im7a1#

我认为ToString()不接受你的字符串格式。
对double进行字符串化并不是最好的方法,尤其是当它是一个可以完美使用逻辑的数字时。
改变你的:

query.Where(q => q.Value.ToString("#,##0.00").StartsWith(someValue);

字符串

query.Where(q => q.Value >= someValue && q.Value < someMinimalValue);


然后,你想取“以”开头的值,所以对于值(对于2.11),它可以是:

query.Where(q => q.Value >= 2.11 && q.Value < 2.12);

qlfbtfca

qlfbtfca2#

看起来你试图在LINQ to Entities查询中将double格式化为字符串,这导致了转换问题。你使用的ToString方法无法转换为SQL,这就是为什么它建议客户端评估。
你可以尝试使用SqlFunctions.StringConvert方法,而不是在查询中使用ToString。下面是一个例子:

using System.Data.Entity.SqlServer;

// ...

query.Where(q => SqlFunctions.StringConvert((double?)q.Value).Trim().StartsWith(someValue))

字符串
这应该有助于将double转换为可以转换为SQL的字符串。添加Trim是为了删除转换过程中可能引入的尾随空格。

djmepvbi

djmepvbi3#

也许这就是你想要的。我只是在“Where”之前添加了“AsQueryable()”:

class Program
    {
        public class Person
        {
            public string Name { get; set; }
            public double Value { get; set; }
        }

        static void Main(string[] args)
        {
            string someValue = "2.3";

            List<Person> people = new List<Person>()
            {
                new Person()
                {
                    Name = "Jack",
                    Value = 2.3
                },
                 new Person()
                {
                    Name = "Nina",
                    Value = 3
                },
                  new Person()
                {
                    Name = "Woody",
                    Value = 2.36589
                },
                   new Person()
                {
                    Name = "David",
                    Value = 10
                   },
            };

            IQueryable<Person> query = people.AsQueryable().Where(q => q.Value.ToString("#,##0.00").StartsWith(someValue));
        }
    }

字符串

tct7dpnv

tct7dpnv4#

Entity Framework无法将具有自定义格式的ToString方法转换为SQL查询。若要解决此问题,可以考虑在应用筛选器之前格式化值。例如:

string formattedSomeValue = someValue.Replace(".", "").Replace(",", ".");
query = query.Where(q => q.Value.ToString("#,0.00").StartsWith(formattedSomeValue));

字符串
在此代码中,formattedSomeValue是通过将欧式千位分隔符(点)替换为空字符串并将欧式小数点分隔符(逗号)替换为点来创建的。这样,您就可以以Entity Framework可以翻译的方式执行过滤。
确保用过滤后的结果替换查询变量,因为像Where这样的LINQ方法会返回一个新的IQueryable对象。
希望有帮助!

相关问题