0

I have database table. The ORM for it is:

public long Id { get; set; }
public System.Guid AttrId { get; set; }
public System.Guid ProdId { get; set; }
public string Value { get; set; }

public virtual Attributes Attributes { get; set; }
public virtual Products Products { get; set; }

As you can see value is a string type. I'm trying to get min and max values by this field (some values represented as double). So here is my method for this:

public double[] GetMaxMinVals(Guid attrId)
{
    double[] res = new double[2];
    using(entityContext = new SiteDBEntities())
    {
        res[0] = entityContext.ProductAttributes.Where(x=>x.AttrId == attrId)
            .Min(x => Convert.ToDouble(x.Value));
        res[1] = entityContext.ProductAttributes.Where(x => x.AttrId == attrId)
            .Max(x => Convert.ToDouble(x.Value));
    }

    return res;
}

But I getting exception:

LINQ to Entities does not recognize the method 'Double ToDouble(System.String)' method, and this method cannot be translated into a store expression.

So how can I search for a string value like a decimal?

3 Answers 3

2

The problem here is your query will be translated into SQL and run on the database, and Entity Framework doesn't know how to translate Convert.ToDouble into valid SQL code.

So you could cast to double as below, which will be later converted to SQL CAST AS statement.

res[0] = entityContext.ProductAttributes.Where(x=>x.AttrId == attrId).Min(x => (double)x.Value);
res[1] = entityContext.ProductAttributes.Where(x => x.AttrId == attrId).Max(x => (double)x.Value);
Sign up to request clarification or add additional context in comments.

1 Comment

Thanx for explaining!
1

First you can cast the Value to double then use Max/Min:

public double[] GetMaxMinVals(Guid attrId)
    {
        double[] res = new double[2];
        using(entityContext = new SiteDBEntities())
        {
            res[0] = entityContext.ProductAttributes
              .Where(x => x.AttrId == attrId)
              .Select(x => x.Value)
              .Cast<double>()
              .Min();
        }

        return res;
    }

3 Comments

Thanks. Now i know another one EF funtion and where to use it ;-)
Did it work? Did you try? Cause when I tried it after I wrote the answer, I realized that it wouldn't for your case. If it works, I probably missed something.
Okay, I am more than glad then!
1

In EF Dbcontext don't support "Convert.ToDouble", you can fix same that:

public double[] GetMaxMinVals(Guid attrId)
        {
            double[] res = new double[2];
            using(entityContext = new SiteDBEntities())
            {
                res[0] = entityContext.ProductAttributes.Where(x=>x.AttrId == attrId).Min(x => (double)x.Value);
                res[1] = entityContext.ProductAttributes.Where(x => x.AttrId == attrId).Max(x => (double)x.Value);
            }

            return res;
        }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.